跳至主要內容

適用於 JavaScript 的原生優先權、高效能 Markdown 插件

最後更新:

Markdown 文字編輯器插件,可將本機文字區域轉換為完整的編輯套件 - 無需同步。所見即所得和純 Markdown 模式、即時預覽、尋找和替換、RTL 支援、深色模式。適用於 Django、Laravel、Rails、Node.js、PHP 和任何堆疊。

理念:“本土第一”

大多數編輯器都打破了標準的網路工作流程。 MarkdownEditor 擁抱它。 由於它直接位於 <textarea> 之上,因此您無需學習處理資料的新方法。

  • 無需資料綁定:開箱即用 <form method="POST">
  • 標準存取:像普通輸入一樣使用document.getElementById('editor').value
  • 與後端無關:可與任何後端(Python、Node.js、PHP 等)配合使用,就像普通表單欄位一樣

MarkdownEditor 與 EasyMDE / SimpleMDE

大多數 JavaScript Markdown 編輯器(EasyMDE、SimpleMDE、基於 CodeMirror 的編輯器)<textarea> 替換為自訂元素。這表示表單提交中斷,.value 不傳回任何內容,並且您必須編寫額外的程式碼才能讀回內容。 MarkdownEditor 與 不同 — 它增強了您現有的文字區域,並且從不取代它。

特徵 Markdown編輯器 EasyMDE / SimpleMDE
保留本機文字區域 ❌ 更換
表單提交按原樣工作 ❌需要額外的JS
透過 .value 取得/設定值 ❌ 需要自訂API
WYSIWYG hybrid mode
內建尋找和替換
RTL 支持
相容於 CSP(無內聯 JS)
零 CSS 衝突
深色模式/主題 有限的
捆綁尺寸 〜116KB ~300KB+

框架整合

由於 MarkdownEditor 保留了本機 <textarea>,因此它無需任何額外程式碼即可與每個後端框架整合。您的服务器接收 Markdown 内容,就像从任何标准表单字段接收一样。

Django

class 新增至您的文字區域小工具並初始化編輯器 - request.POST['content'] 無需額外步驟即可運作。

python
1
2
3
4
5
6
7
8
# forms.py
class PostForm(forms.ModelForm):
    class Meta:
        model = Post
        fields = ['content']
        widgets = {
            'content': forms.Textarea(attrs={'class': 'markdown-editor'}),
        }
javascript
1
2
new MarkdownEditor('.markdown-editor');
// request.POST['content'] contains the markdown on submit

Laravel

f.text_area 與類別一起使用 — $request->input('content') 直接接收降價。

html
1
2
<textarea name="content" class="markdown-editor">{{ old('content') }}</textarea>
<script>new MarkdownEditor('.markdown-editor');</script>

紅寶石 on Rails

開箱即用,可與 form_with 搭配使用 — params[:content] 包含降價。對於 Turbo Drive,請使用 turbo:load 而不是 DOMContentLoaded

javascript
1
2
3
4
5
6
document.addEventListener('turbo:load', () => {
    document.querySelectorAll('.markdown-editor:not([data-mde-init])').forEach(el => {
        el.setAttribute('data-mde-init', 'true');
        new MarkdownEditor(el);
    });
});

Node.js / Express

req.body.content 接收表單提交時的降價 — 無同步步驟,無自訂提取。

html
1
2
3
<textarea name="content" class="markdown-editor"></textarea>
<script src="https://cdn.jsdelivr.net/npm/markdown-text-editor"></script>
<script>new MarkdownEditor('.markdown-editor');</script>

PHP

$_POST['content'] 的工作方式與任何標準文字區域完全相同 - 將其放入,您現有的表單處理需要零更改。

html
1
2
3
4
5
6
<form method="POST" action="save.php">
  <textarea name="content" class="markdown-editor"></textarea>
  <button type="submit">Save</button>
</form>
<script src="https://cdn.jsdelivr.net/npm/markdown-text-editor"></script>
<script>new MarkdownEditor('.markdown-editor');</script>

主要特點

🖼️ 高級圖像上傳(SEO 優化)

不要使用大量的 Base64 字串來使資料庫膨脹。配置我們的 API 以將圖像直接上傳到您的伺服器或 S3 儲存桶。編輯器接收 URL,讓您的 Markdown 文件保持簡潔,並保持網站的 SEO 排名較高。

🔀 混合模式和普通模式

為您的用戶提供兩全其美的服務。在用於輕鬆格式化的視覺 (WYSIWYG) 混合模式和用於無幹擾的原始語法編輯的純 Markdown 模式之間切換。

🌍 全球就緒,支援 RTL

對從右到左 (RTL) 語言的完全本機支援。非常適合需要阿拉伯語、烏爾都語或波斯語支援並具有自動文字方向對齊功能的項目。

⚡ 大規模性能

  • 輕量級:佔用空間約 116KB,不會減慢頁面載入速度
  • 大文件支援:經過最佳化,可以處理數千行文本,而不會出現輸入延遲或瀏覽器凍結的情況
  • 智慧型渲染:去抖動預覽更新、快取樣式計算以及清單延續與縮排之間的無衝突鍵盤處理 - 因此 Tab 和 Enter 總是只做一件事

♿ 預設可訪問

內建完整的 ARIA 支持,無需額外配置。工具列是一個適當的 role="toolbar" 地標,預覽窗格是一個帶有標籤的 role="region",所有 SVG 圖標都對屏幕閱讀器隱藏,預覽切換通過 aria-pressed 顯示其開/關狀態,禁用的工具列按鈕模態框關閉時將焦點回到觸發按鈕。

🛡️ 零 CSS 衝突

所有編輯器樣式都完全限定在 .markdown-editor-wrapper 元素範圍內。 Tailwind 的全域預檢(h1h6abutton 等的元素重設)被排除在外,因此編輯器可以與 Bootstrap、Tailwind 或同一頁面上的任何其他 CSS 框架一起使用,而不會破壞單一樣式。

🔒 XSS 安全預覽

渲染的預覽在寫入 DOM 之前透過 DOMPurify 進行清理。精心設計的 Markdown 輸入中的腳本標籤、內聯事件處理程序和惡意 URL 都會自動刪除——無需配置。

Markdown 編輯器演示

快速實施

1. 安裝

NPM(捆綁器:Vite、webpack、Rollup 等)

bash
npm install markdown-text-editor
javascript
1
2
import MarkdownEditor from 'markdown-text-editor';
new MarkdownEditor('#markdown-editor');

CDN:ES模組

html
1
2
3
4
<script type="module">
  import MarkdownEditor from 'https://cdn.jsdelivr.net/npm/markdown-text-editor/dist/markdown-text-editor.es.js';
  new MarkdownEditor('#markdown-editor');
</script>

CDN:全域腳本標籤(IIFE)

無需導入 - MarkdownEditor 可自動作為全域變數使用。

html
1
2
3
4
5
6
7
8
9
<form action="/api/save" method="POST">
  <textarea id="markdown-editor" name="content"># Hello World</textarea>
  <button type="submit">Save Content</button>
</form>

<script src="https://cdn.jsdelivr.net/npm/markdown-text-editor"></script>
<script>
  new MarkdownEditor('#markdown-editor');
</script>

2. 配置與初始化

傳遞一個選項物件來自訂編輯器。所有選項都是可選的 - 省略任何選項即可使用預設值。

javascript
1
2
3
4
const editor = new MarkdownEditor('#markdown-editor', {
  placeholder: 'Write your markdown...',
  toolbar: ['heading', 'bold', 'italic', 'strikethrough', 'ul', 'ol', 'checklist', 'blockquote', 'link', 'preview'],
});

喜歡 Markdown 編輯器嗎?

It takes 2 seconds and helps the project grow. It's part of Frutjam, a free Tailwind CSS component library — a star there helps too.

在 GitHub 上加星標

4. 配置與客製化

您可以透過傳遞 options 物件來完全自訂編輯器的行為和介面。如果省略選項,則使用預設值。

財產 類型 預設 目的
mode string 'plain' 設定初始視圖。使用混合以獲得所見即所得的體驗,或使用普通的原始語法。
placeholder string 'Write...' 編輯器為空時顯示的文字。
toolbar array [...] 定義顯示哪些工具以及顯示順序。
footer false | object 全部可見 控制編輯器下方顯示的狀態列。設定為 false 以完全隱藏它,或傳遞一個物件來切換單一統計資訊。
theme string 遺傳 明確設定編輯器主題(淺色、深色、雪莓、黑莓)。如果省略,編輯器將從最近的祖先元素或 <textarea> 本身繼承 data-theme
minHeight number 200 當內容較短時,編輯器將縮小到的最小高度(以像素為單位)。與 maxHeight 配對以設定自動增長範圍。
maxHeight number 500 編輯器在非全螢幕模式下可以增長到的最大高度(以像素為單位)。一旦內容超過此高度,編輯器內就會出現捲軸。該編輯器還有一個拖曳手柄,因此使用者可以手動將其大小調整到超出此限制。
onChange function undefined 每次內容變更時都會觸發回調 - 鍵入、工具列操作、撤銷/重做和清單延續。接收目前的 markdown 字串作為其唯一的參數。

🛠 工具列自訂

工具列是模組化的。您可以透過修改陣列來創建最低限度的體驗或功能齊全的電源套件。

可用工具
類別 工具鍵
版式 heading, bold, italic, strikethrough, blockquote
清單 ul (子彈), ol (編號的), checklist
程式碼 code (排隊), codeblock (圍欄塊)
刀片 hr (水平線), table (表格模板)
媒體 link, image
編輯 undo, redo, indent, outdent
看法 preview
💡實施技巧:
  • 重新排序:按鈕會依照您在陣列中列出的確切順序顯示
  • 刪除:只需從陣列中省略任何鍵(例如image)即可為使用者完全停用該功能
  • 原生後備:如果您未在 JS 中提供 placeholder,外掛程式將自動使用 HTML <textarea> 中的 placeholder 屬性

📊 頁腳(狀態列)

頁腳位於編輯器下方,顯示遊標的 linecolumn、文件的 字元計數 以及可選的 字計數 — 所有這些均即時更新。預設情況下它是可見的,並且每個統計資料都可以獨立切換。

鑰匙 類型 預設 描述
line boolean true 顯示目前行號。
col boolean true 顯示目前的列號。
chars boolean true 顯示總字元數。
words boolean false 顯示總字數。預設為關閉 — 設定為 true 以啟用。
使用範例
javascript
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
// Default — line, col, and chars visible
new MarkdownEditor('#editor');

// Disable the footer entirely
new MarkdownEditor('#editor', { footer: false });

// Hide only character count
new MarkdownEditor('#editor', { footer: { chars: false } });

// Hide line and column, keep character count
new MarkdownEditor('#editor', { footer: { line: false, col: false } });

// Show only line number
new MarkdownEditor('#editor', { footer: { col: false, chars: false } });

// Enable word count alongside the defaults
new MarkdownEditor('#editor', { footer: { words: true } });

// Show word count only
new MarkdownEditor('#editor', { footer: { line: false, col: false, chars: false, words: true } });

5. 取得、設定和提交內容

MarkdownEditor 的核心優勢之一是它保持底層 <textarea> 完美同步。無論您使用現代 JavaScript 框架還是傳統後端(例如 Django、PHP 或 Laravel),工作流程都保持簡單且原生。

1. The Native Way(推薦)

由於編輯器增強了標準文字區域,因此您可以使用熟悉的 DOM 方法。這是無需學習新 API 即可與資料互動的最快方式。

javascript
1
2
3
4
5
// Retrieve content via ID
const markdown = document.getElementById('markdown-editor').value;

// Set content via ID (The editor UI updates automatically)
document.getElementById('markdown-editor').value = "# New Heading Content";

2. 使用變數引用

如果您有對 textarea 元素的引用,則可以直接使用它 - 不需要特定於庫的 API。

javascript
1
2
3
4
5
6
7
const textarea = document.getElementById('markdown-editor');

// Retrieve content
const markdown = textarea.value;

// Set content (the editor UI reflects this immediately)
textarea.value = "## Updated via JS";

3. 設定和讀取內容

設定初始內容的建議方法是直接在 <textarea> HTML 中 - 這自然適用於每個後端框架(Django、Laravel、Rails、PHP 等),並且編輯器會在 init 時自動呈現它。

html
1
2
<!-- Recommended: set content server-side -->
<textarea id="markdown-editor"># Hello World</textarea>

若要在執行時間讀取或更新內容,請使用本機 textarea 值。更新後呼叫 editor.render() 以刷新預覽層和混合層。

javascript
1
2
3
4
5
6
7
8
const textarea = document.getElementById('markdown-editor');

// Read
const markdown = textarea.value;

// Update at runtime
textarea.value = '# New content';
editor.render();

4. 拆除編輯器-destroy()

呼叫 editor.destroy() 刪除編輯器 DOM 包裝器並將原始 <textarea> 還原到其在文件中的位置。在單頁應用程式中卸載視圖時很有用。

javascript
1
2
3
4
const editor = new MarkdownEditor('#markdown-editor');

// Remove the editor and restore the plain textarea
editor.destroy();
使用 onChange 回應更改

傳遞 onChange 回呼以在每次內容變更時收到通知。接收目前的 Markdown 字串。

javascript
1
2
3
4
5
const editor = new MarkdownEditor('#markdown-editor', {
    onChange(value) {
        console.log('Content changed:', value.length, 'characters');
    }
});
使用 localStorage 自動儲存草稿

使用 onChange 在每次按鍵時儲存草稿。在初始化編輯器之前透過預先填充文字區域來恢復它。

javascript
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
const DRAFT_KEY = 'my-page-draft';

// Restore saved draft before init (only if textarea starts empty)
const textarea = document.getElementById('markdown-editor');
const saved = localStorage.getItem(DRAFT_KEY);
if (saved && !textarea.value) textarea.value = saved;

// Save on every change
const editor = new MarkdownEditor('#markdown-editor', {
    onChange(value) {
        localStorage.setItem(DRAFT_KEY, value);
    }
});

// Clear draft after successful form submission
document.querySelector('form').addEventListener('submit', () => {
    localStorage.removeItem(DRAFT_KEY);
});

4. 輕鬆自動提交表單

由於 MarkdownEditor 直接建立在原生 <textarea> 上,因此它開箱即用,與每個後端框架(Django、Laravel、PHP、Ruby on Rails 等)相容。

這就是「本地優先」理念的閃光點。您無需在提交表單之前手動同步資料。瀏覽器將編輯器視為標準輸入欄位。

html
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
<form method="POST" action="/api/submit">
  <textarea id="markdown-editor" name="content" class="h-48" rows="5">
    # Initial Content
  </textarea>

  <button type="submit">Submit to Server</button>
</form>

<script>
  // Just initialize it. That's it.
  new MarkdownEditor('#markdown-editor');
</script>

注意: MarkdownEditor 外掛程式必須初始化

只需使用標準 HTML <form>。文字區域上的 name 屬性是您的伺服器將用來識別內容的屬性。

🚀 為什麼它會改變後端的遊戲規則

由於編輯器保留本機 <textarea> 行為,因此您的伺服器將資料作為標準字串處理。所需的額外邏輯為零,無需 preventDefault() 也無需手動建構 FormData

💡 為什麼這是一個「殺手級功能」:

大多數編輯器(如 Quill、Editor.js、simpleMDE、easyMDE)以複雜的 JSON 結構保存資料。如果開發人員使用這些,他們必須重寫他們的資料庫模式和渲染邏輯。

透過 MarkdownEditor,開發人員可以使用舊網站,用編輯器取代普通的 <textarea>,而後端甚至不知道它發生了變化。它只是收到與往常相同的原始文本,但用戶獲得了 10 倍更好的體驗。

框架/語言 如何存取 Markdown 內容
PHP $_POST['content']
Django request.POST.get('content')
Node.js (Express) req.body.content
Laravel $request->input('content')
Ruby on Rails params[:content]

配置選項

🖼️高級圖片上傳

本地處理圖像上傳(而不是依賴緩慢且佔用大量記憶體的 Base64 字串)對於效能和 SEO 來說都是一個重大勝利。

配置選項

圖像工具支援 fileInput 配置來處理直接伺服器上傳。

  • accept:定義允許的影像格式陣列(例如「webp」、「avif」)
  • uploadUrl:指定將透過 POST 傳送 File 物件的後端端點
  • params:可選對象,用於與映像檔一起傳送附加資料(例如 CSRF 令牌、使用者 ID 或資料夾名稱)

使用範例(完整配置)

javascript
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
const options = {
  placeholder: 'Start writing...',
  toolbar: [
    'link',
    {
      image: {
        fileInput: {
            accept: ['webp', 'avif'], // restrict the image upload format
            uploadUrl: '/api/upload', // Your upload endpoint
            params: {
                _token: 'your_csrf_token_here', // Essential for Laravel/Django
                folder: 'blog_posts'
            }
        },
        // Supports boolean: true/false OR object: { required: true }
        altInput: { required: true }
      }
    },
    'preview'
  ],
}
const editor = new MarkdownEditor('#markdown-editor', options);

📡 伺服器整合詳細信息

1. 請求

編輯器以 multipart/form-data 形式傳送 POST 請求。預設情況下,它包括:

  • image_file:實際的文件對象
  • image_alt:使用者輸入的替代文本
  • ...加上 params 物件中定義的任何自訂數據
2. 所需的回應

若要確認上傳成功並將映像插入編輯器,您的伺服器必須傳回以下 JSON 結構:

json
1
2
3
4
{
  "success": true,
  "image_path": "https://cdn.yourdomain.com/uploads/image.webp"
}

注意:確保使用 image_path 鍵作為上傳圖像的 URL。

圖像替代文字驗證 (altInput)

為了確保您的內容保持可訪問性和 SEO 友善性,MarkdownEditor 預設強制執行替代文字驗證。您可以使用布林簡寫或詳細物件來配置此行為。

  • 預設行為:如果未定義altInput,則預設為{ required: true }
  • 強制輔助使用:在提供替代說明之前,使用者將無法插入影像
設定範例:
1.預設(無需配置)
javascript
1
2
3
4
// Alt text is REQUIRED by default
image: {
  fileInput: { uploadUrl: '/api/upload' }
}
2. 速記(禁用驗證)

如果您想允許沒有描述的圖像,只需將布林值設為 false 即可。

javascript
1
2
3
image: {
  altInput: false // Users can now skip the alt text field
}
3. 基於物件(顯)
javascript
1
2
3
4
5
image: {
    altInput: {
        required: false // Disables alt text validation — users can skip the alt field
    }
}

標準影像使用(無fileInput):

如果未配置 fileInput,則編輯器預設為簡單的基於 URL 的模式。如果您的用戶主要連結到外部圖像主機,那麼這是理想的選擇。

javascript
1
2
3
4
5
6
7
8
const options = {
  toolbar: [
    'link',
    'image',
    'preview'
  ],
}
const editor = new MarkdownEditor('#markdown-editor', options);
💡 為什麼要使用參數?

在 Laravel 或 Django 等框架中,如果沒有 CSRF 令牌,則無法上傳檔案。透過將 _token 新增至 params 對象,您的請求將無縫地通過後端的安全中介軟體,從而維護伺服器端控制器的「零邏輯」理念。

🔀 編輯模式

MarkdownEditor 提供兩種不同的方式來撰寫和格式化內容。您可以在傳統的以語法為中心的視圖或現代的視覺優先體驗之間切換。

配置

您可以在初始化期間使用 mode 屬性定義啟動模式。

  • plain預設):乾淨、高效能的 Markdown 環境,其中語法(如 **bold**# header)可見。開發人員和 Markdown 純粹主義者的理想選擇
  • hybrid:所見即所得的體驗,可在您鍵入時即時呈現格式(粗體、斜體、標題),同時仍保持底層 Markdown 結構。
執行:
javascript
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
// Default initialization (Plain Mode)
new MarkdownEditor('#markdown-editor');

// Explicit Plain Mode
new MarkdownEditor('#markdown-editor', {
    mode: 'plain'
});

// Hybrid (Visual) Mode
new MarkdownEditor('#markdown-editor', {
    mode: 'hybrid'
});
混合和普通模式預覽:
混合模式

當您鍵入時,視覺格式會即時呈現。

普通模式(預設)

專注於原始 Markdown 語法以提供輕量級體驗。

配置 財產/工具 描述
選項對象 placeholder 設定文字區域的佔位符文字(可選,因為您也可以使用標準 HTML 文字區域屬性)
mode: 'hybrid' 實現所見即所得的體驗,在您鍵入時即時呈現格式(粗體、斜體、標題)
工具列:決定工具列中顯示的工具
及其順序。
heading 開啟下拉式選單以選擇標題等級 H1–H6
bold 啟用粗體文字格式。
italic 啟用斜體文字格式。
strikethrough 允許文字刪除線。
ol (有序列表):將文字轉換為編號清單格式。
ul (無序列表):將文字轉換為項目符號清單。
checklist 在文字中新增複選框,使其非常適合任務、待辦事項清單或追蹤完成狀態。
blockquote 反白顯示引用或強調的文字。
code 將選定的文字包含在單一反引號中以實現內聯代碼。再次點選可刪除反引號。
codeblock 將選定的文字包裝在三重反引號圍欄代碼區塊中。再次點選可移除柵欄。
hr 在遊標位置插入一條 --- 水平線。
table 在遊標位置插入起始 2x3 Markdown 表格範本。
image 讓您透過 Markdown 語法插入圖片。
link 允許您向文字添加超連結。
undo 撤銷最後的變更。
redo 重新套用上次撤銷的變更。
indent 增加縮排等級。
outdent 降低壓痕等級。
preview 切換全螢幕並排預覽。預覽窗格中的核取方塊可按一下並立即更新 Markdown 來源。按 Esc 鍵退出全螢幕。
高級圖像上傳功能
允許配置圖像上傳到
您自己的伺服器並透過 API 設定圖像
路徑。這可以提高效能和 SEO。
fileInput accept:允許的映像檔類型陣列(例如'webp''avif')。
uploadUrl:透過 POST 傳送檔案的後端端點。
params:額外資料的可選物件(CSRF 令牌、使用者 ID、資料夾名稱)
altInput required: false:停用替代文字輸入驗證(預設為 true)

⌨️ 鍵盤快速鍵

常見的格式化操作可以直接從鍵盤觸發,無需觸摸工具列。每個快捷方式也顯示在對應的工具列按鈕的工具提示中。

捷徑 行動
Ctrl + B  /  ⌘ B 切換粗體
Ctrl + I  /  ⌘ I 切換斜體
Ctrl + K  /  ⌘ K 插入連結
Ctrl + `  /  ⌘ ` 切換內聯代碼
Ctrl + Shift + S  /  ⌘ ⇧ S 切換刪除線
Ctrl + Z  /  ⌘ Z 撤銷
Ctrl + Shift + Z  /  ⌘ ⇧ Z 重做
Tab 縮排選定的行
Shift + Tab 減少縮排選定的行
Ctrl + F  /  ⌘ F 打開尋找面板
Ctrl + H  /  ⌘ H 打開尋找和取代面板
Escape 關閉查找面板/退出全螢幕預覽

🔍 找出並找到代替

編輯器內提供內建尋找和取代面板 - 無需瀏覽器擴充功能或單獨的工具。

  • 按下 Ctrl + F(或 ⌘ F)開啟尋找面板
  • Ctrl + H(或⌘ H)開啟尋找和尋找視窗。更換面板
  • 搜尋不區分大小寫並顯示即時比賽計數器(例如3 / 12
  • 使用 ▲ / ▼ 按鈕或 Enter / Shift + Enter 導覽匹配項
  • 替換替換目前反白顯示的匹配項; 全部替換一次替換所有出現的內容
  • Escape 關閉面板並將焦點返回編輯器

此面板浮動在編輯器內容區域的右上角,不會中斷寫入。

🌙 主題化

MarkdownEditor 自動從周圍頁面繼承其主題 - 無需配置。編輯器在初始化時從最近的祖先讀取data-theme,因此它與您網站的主題保持同步。

主題如何解決(優先順序)

  1. theme option - 在選項物件中傳遞的明確覆蓋
  2. <textarea> 上的 data-theme — 直接在元素上設定
  3. 任何祖先的資料主題 - 例如<html><body> 或包裝 <div>

可用主題

'light'(預設)、'dark''snowberry''darkberry'

選項 1 — 從 <html> 或任何祖先繼承(零配置)
html
1
2
3
4
5
6
<html data-theme="dark">
  ...
  <textarea id="markdown-editor"></textarea>
  <script>
    new MarkdownEditor('#markdown-editor'); // picks up dark automatically
  </script>
選項 2 — 直接在 <textarea> 上設定 data-theme
html
1
2
3
4
<textarea id="markdown-editor" data-theme="dark"></textarea>
<script>
  new MarkdownEditor('#markdown-editor');
</script>
選項 3 — 明確 theme 選項(涵蓋所有內容)
javascript
1
2
3
new MarkdownEditor('#markdown-editor', {
    theme: 'dark'
});

🎨 透過 CSS 變數自訂主題

您可以透過覆寫 .markdown-editor-wrapper 元素或任何 [data-theme] 選擇器上的 CSS 變數來完全自訂編輯器的外觀。所有顏色均使用 OKLCH 色彩空間 以獲得統一的感知結果。

多變的 目的 淺色預設 深色預設
--color-base 編輯背景 oklch(100% 0 0) oklch(10.9% 0 0)
--color-on-base 主要文字顏色 oklch(22% 0 0) oklch(98% 0 0)
--color-primary 主要重音(工具列活動,連結) oklch(51.1% .262 277) oklch(66.4% .184 286)
--color-on-primary 原色表面上的文字 oklch(96.2% .018 272) oklch(10% .01 270)
--color-secondary 次要口音 oklch(59.1% .293 323) oklch(65% .18 220)
--color-accent 反白顯示重音符號(內聯代碼,斜體) oklch(54.1% .281 293) oklch(75% .18 50)
--color-neutral 中性表面(邊界、分隔線) oklch(15% 0 0) oklch(85% 0 0)
--color-error 錯誤狀態顏色 oklch(57.7% .245 27) oklch(60% .22 30)
--border-radius 編輯器框架的圓角 0.25rem
自訂主題範例

編輯器初始化後覆蓋 .markdown-editor-wrapper 上的任何變量,或在樣式表中定義自訂 [data-theme] 區塊:

css
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
/* Override individual variables */
.markdown-editor-wrapper {
    --color-primary: oklch(60% 0.2 30);   /* orange accent */
    --border-radius: 0.5rem;
}

/* Or define a full custom theme */
[data-theme="brand"] .markdown-editor-wrapper,
.markdown-editor-wrapper[data-theme="brand"] {
    --color-base:       oklch(15% 0.01 250);
    --color-on-base:    oklch(95% 0 0);
    --color-primary:    oklch(65% 0.22 145);   /* green */
    --color-on-primary: oklch(10% 0 0);
    --color-accent:     oklch(75% 0.18 60);
    --color-neutral:    oklch(80% 0 0);
    --border-radius:    0.75rem;
}
javascript
new MarkdownEditor('#markdown-editor', { theme: 'brand' });
  • 即時預覽:在您輸入時查看立即呈現的 Markdown。
  • 語法突出顯示:透過清晰的程式碼和 Markdown 格式增強可讀性。
  • 輕鬆整合:只需最少的設定即可無縫整合到任何 Web 專案中。
  • 可自訂工具列:動態配置和重新排序工具列選項,例如粗體、斜體等。

特徵

🔌 原生表單集成

工作原理與標準 <textarea> 完全相同。沒有複雜的 API — 只需使用 valuename 屬性。它「只適用於」PHP、Django 或 Node.js 中的標準 HTML 表單提交。

🖼️ 高級圖片上傳

透過 API 設定本機伺服器上傳。透過在您自己的 CDN 上託管圖像,避免使用繁重的 Base64 字串,以確保更快的頁面加載和卓越的 SEO。

🔀 混合模式和普通模式

在用於視覺化編輯的混合 (WYSIWYG) 體驗和用於傳統編碼感覺的純 Markdown 模式之間切換。

🚀 高性能

一個針對「重內容」進行最佳化的小型 ~116KB 捆綁包。處理大量文件和大文件,不會出現任何輸入延遲或效能下降。

🌍 內建 RTL 支持

阿拉伯語、烏爾都語和波斯語等從右到左語言的本機支援。非常適合建立全球可訪問的應用程式。

🌙 自適應主題

包括自動深色模式支援。它與您的系統設定或 Frutjam UI 庫同步,以提供無縫的視覺體驗。

📝 智能編輯

GitHub 風格的自動清單延續,適用於有序清單、無序列表和清單 - 按 Enter 鍵,編輯器將繼續該模式。預覽窗格中的核取方塊可點選並立即同步回 Markdown 來源。

📱 完全響應

流暢、行動優先的使用者介面,完美適應桌上型電腦、平板電腦和智慧型手機,隨時隨地進行編輯。

📦 普遍支持

ESM、UMD、CommonJS 和 IIFE 相容。透過 CDN (<script src>)、npm 或任何捆綁器(Vite、webpack、Rollup)開箱即用 — 無需額外配置。

♿ 預設可訪問

內建完整的 ARIA 支援 - 工具列地標、帶標籤的預覽區域、螢幕閱讀器友好的按鈕、預覽切換上的 aria-pressed、非活動工具上的 disabledaria-disabled,以及模態關閉時正確的焦點恢復。

🛡️ 零 CSS 衝突

編輯器樣式的範圍完全限於 .markdown-editor-wrapper。 Tailwind 的全域預檢被排除,因此編輯器可以安全地與 Bootstrap、Tailwind 或任何其他框架一起使用,而不會破壞它們的風格。

⌨️ 鍵盤快速鍵

Ctrl+BCtrl+ICtrl+KCtrl+`Ctrl+Shift+S — 無需觸控滑鼠的常見格式化操作。每個快捷方式都顯示在工具列按鈕的工具提示中。

🔍 找出並找到代替

Ctrl+F 進行尋找或按Ctrl+H 開啟尋找&代替。不區分大小寫的搜索,具有即時匹配計數器、下一個/上一個導航、單一替換和全部替換 - 無需離開編輯器。

完整配置範例

使用這個綜合範例來初始化 MarkdownEditor 的所有主要功能,包括自訂工具列排序和進階映像上傳處理。

javascript
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
const editor = new MarkdownEditor('#markdown-editor', {
    mode: 'hybrid',
    placeholder: 'Start writing...',
    footer: {
        line: true,
        col: true,
        chars: true,
        words: true,
    },
    onChange(value) {
        console.log('Content updated:', value.length, 'characters');
    },
    toolbar: [
        'heading', 'bold', 'italic', 'strikethrough', 'blockquote',
        'ul', 'ol', 'checklist',
        'code', 'codeblock', 'hr', 'table',
        {
            image: {
                fileInput: {
                    accept: ['webp', 'avif', 'png'],
                    uploadUrl: '/api/upload'
                }
            }
        },
        'link', 'undo', 'redo', 'indent', 'outdent', 'preview'
    ],
});

// Read content natively
const markdown = document.getElementById('markdown-editor').value;

// Update content programmatically (dispatch input to keep preview in sync)
// const ta = document.getElementById('markdown-editor');
// ta.value = '# New content';
// ta.dispatchEvent(new Event('input', { bubbles: true }));

// destroy() when the view unmounts (SPAs)
// editor.destroy();