在 Markdown 中使用 JavaScript
雖然 Markdown 主要是一種用於格式化文字的標記語言,但你可以通過 JavaScript 增強 Markdown 文檔,添加互動性和動態功能。
理解限制
標準的 Markdown 解析器不會執行 JavaScript 代碼。然而,有幾種方法可以將 JavaScript 與 Markdown 整合:
- HTML Script 標籤:直接在 HTML 塊中包含 JavaScript
- Markdown 處理器:使用支持 JavaScript 執行的處理器
- 靜態網站生成器:利用構建時的 JavaScript 處理
- 客戶端渲染:在 Markdown 轉換為 HTML 後添加 JavaScript
基本 JavaScript 整合
內聯腳本標籤
你可以使用 HTML script 標籤直接在 Markdown 中嵌入 JavaScript:
markdown
# 我的互動式文檔
<script>
function greet() {
alert('來自 Markdown 的問候!');
}
</script>
<button onclick="greet()">點擊我</button>外部腳本
引用外部 JavaScript 文件:
markdown
<script src="https://cdn.example.com/script.js"></script>
<div id="dynamic-content"></div>常見用例
1. 互動式表單
markdown
# 聯絡表單
<form id="contactForm">
<input type="text" id="name" placeholder="您的姓名">
<input type="email" id="email" placeholder="您的電郵">
<button type="submit">提交</button>
</form>
<script>
document.getElementById('contactForm').addEventListener('submit', function(e) {
e.preventDefault();
const name = document.getElementById('name').value;
alert('謝謝,' + name + '!');
});
</script>2. 動態內容加載
markdown
# 最新文章
<div id="posts-container"></div>
<script>
fetch('/api/posts')
.then(response => response.json())
.then(posts => {
const container = document.getElementById('posts-container');
posts.forEach(post => {
container.innerHTML += `<h3>${post.title}</h3><p>${post.excerpt}</p>`;
});
});
</script>3. 數據可視化
markdown
# 銷售圖表
<canvas id="salesChart" width="400" height="200"></canvas>
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<script>
const ctx = document.getElementById('salesChart').getContext('2d');
new Chart(ctx, {
type: 'line',
data: {
labels: ['1月', '2月', '3月', '4月'],
datasets: [{
label: '銷售額',
data: [12, 19, 3, 5]
}]
}
});
</script>靜態網站生成器整合
Jekyll
Jekyll 不在構建時執行 JavaScript,但你可以在佈局中包含它:
liquid
---
layout: default
---
{{ content }}
<script>
// 你的 JavaScript 代碼
</script>Gatsby
Gatsby 支持在 MDX 中使用 React 組件:
mdx
import { useState } from 'react'
export const Counter = () => {
const [count, setCount] = useState(0)
return <button onClick={() => setCount(count + 1)}>計數: {count}</button>
}
# 我的文檔
<Counter />Next.js
在 Next.js 中使用 MDX 實現完整的 React 整合:
mdx
import dynamic from 'next/dynamic'
const DynamicComponent = dynamic(() => import('../components/MyComponent'))
# 互動式內容
<DynamicComponent />安全注意事項
XSS 防護
在 Markdown 中使用 JavaScript 時,始終清理用戶輸入:
javascript
// 不好:直接 HTML 注入
element.innerHTML = userInput;
// 好:使用 textContent 或清理
element.textContent = userInput;
// 或者
element.innerHTML = DOMPurify.sanitize(userInput);內容安全策略
實施 CSP 頭來限制腳本執行:
html
<meta http-equiv="Content-Security-Policy"
content="script-src 'self' https://trusted-cdn.com;">最佳實踐
- 分離 JavaScript:盡可能將 JavaScript 存儲在外部文件中
- 漸進增強:確保內容在沒有 JavaScript 時也能工作
- 使用 CDN:從 CDN 加載流行的庫以獲得更好的緩存
- 最小化內聯腳本:使用事件委託而不是內聯處理程序
- 文檔化依賴:清楚地說明所需的 JavaScript 庫
結論
雖然 Markdown 本身不執行 JavaScript,但你可以有效地結合這兩種技術來創建豐富的互動式文檔。選擇最適合你用例的方法,始終優先考慮安全性和用戶體驗。