纯HTML无法实现Markdown编辑器,必须依赖JavaScript解析渲染,并严格区分编辑态与预览态;textarea仅输入原始文本,需监听事件调用marked等库解析,注意XSS防护与性能优化。

纯 HTML 无法实现 Markdown 编辑器——它必须配合 JavaScript 解析与渲染,且需要明确区分「编辑态」和「预览态」两个核心环节。
为什么 textarea 直接写 Markdown 不会自动渲染
HTML 本身不理解 Markdown 语法。textarea 或 contenteditable 元素只负责接收原始文本,浏览器不会主动调用解析器。你看到的是一堆 # 标题 和 * 列表项,不是标题和列表。
- 常见错误:把 Markdown 当成 HTML 子集,直接插入
<div> 并期望它“生效”<li>正确路径:监听输入(如 <code>input或keyup事件),将内容传给 Markdown 解析库(如marked、marked.js或轻量级的simple-markdown) - 注意:
marked默认不转义 HTML,若接受用户输入,务必开启sanitize: true防 XSS - 典型问题:用户按
Enter插入的是<div> 或 <code><p></p><div class="aritcle_card flexRow artxards"> <div class="artcardd flexRow"> <a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill10133" title="ClawKeeper — Tasks & habits in a plain markdown file"><img src="https://img.php.cn/upload/skill/001/246/273/6adaf20dee630206.jpg" alt="ClawKeeper — Tasks & habits in a plain markdown file" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a> <div class="aritcle_card_info flexColumn"> <a rel="nofollow" href="/xiazai/skill10133" title="ClawKeeper — Tasks & habits in a plain markdown file" class="overflowclass">ClawKeeper — Tasks & habits in a plain markdown file</a> <p class="overflowclass">任务和习惯存放在本地纯文本 Markdown 文件中,免费、私密、原生支持。</p> </div> <a rel="nofollow" href="/xiazai/skill10133" title="ClawKeeper — Tasks & habits in a plain markdown file" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a> </div> </div>,不是换行符\n;复制粘贴带样式的文字会混入大量内联样式 - 如果坚持用,需重写所有输入行为:拦截
keydown处理Tab缩进、Enter换行、**包裹等,并同步维护一份纯文本缓存 - 更稳妥的做法:用
textarea+ 实时预览面板(divwithinnerHTML),二者内容双向绑定 - 加防抖:用
setTimeout延迟 300ms 再触发解析,用户停顿后才更新预览 - 跳过空内容:
if (!text.trim()) { preview.innerHTML = ''; return; } - 避免全量重绘:对超长内容(如 >2000 字符),可只渲染可视区域(需配合 IntersectionObserver 或滚动监听),但多数场景下防抖已足够
- 注意
marked版本差异:v4+ 默认启用 GFM 表格、脚注等,若不需要,用marked.use({ extensions: [] })关闭以提速
contenteditable 能不能当 Markdown 编辑器用
可以,但代价高、体验差——它本质是富文本编辑器,和 Markdown 的“所写即所得”理念冲突。
如何避免实时渲染卡顿和 DOM 重绘抖动
每敲一个字都调用 marked.parse() 并更新 innerHTML,在长文档或低端设备上会明显卡顿。
真正难的不是“怎么让 Markdown 显示出来”,而是控制解析边界——比如代码块里的 ```html 不能被误解析为 HTML 标签,数学公式 $x^2$ 不被当作斜体,还有行内链接中嵌套的括号匹配。这些细节,取决于你选的解析器是否支持扩展语法,以及是否愿意自己写 tokenizer。










