直接用无法在富文本编辑器中可靠工作,因浏览器原生execCommand行为不一致、光标与缩进逻辑不可控,且需手动处理选区状态、手写插入逻辑及HTML清洗。

为什么直接用
无法在富文本编辑器中可靠工作
浏览器原生的 盲目调用命令会导致格式错乱或 DOM 损坏。实际使用时需先验证上下文: 当需要精确控制 直接取 text 真正难的不是生成 document.execCommand('insertOrderedList') 行为不一致:Chrome 可能插入带 start 属性的 ,Firefox 常生成空 ,Safari 甚至可能把列表项塞进 。更关键的是,用户回车后光标位置、缩进逻辑、嵌套列表展开方式全由浏览器私有实现决定,无法控制。
execCommand 插入有序列表前必须检查选区状态
editor.focus(),否则命令静默失败getSelection().toString().trim() === '',空选区触发 insertOrderedList 会生成孤立 <ol></ol>
document.queryCommandState('insertOrderedList') 返回
true 时,应优先执行 outdent 或 indent 而非重复插入justifyLeft)在 Firefox 中 queryCommandState 不可靠,建议改用 getComputedStyle(anchorNode.parentNode).textAlign
手写
插入逻辑比依赖 execCommand 更可控start、type、嵌套层级或自定义 li 内容结构时,必须绕过 execCommand,用 Range + DocumentFragment 手动插入:
const selection = window.getSelection(),确认 rangeCount > 0
const ol = document.createElement('ol'),设置 ol.start = 3 或 ol.type = 'A'
li:const li = document.createElement('li'); li.append(range.extractContents()); ol.append(li)
range.insertNode(ol) 插入,而非 execCommand
Range 定位易偏移,插入后需手动 selection.collapseToEnd() 重置光标保存和导出时
的 HTML 必须清洗editor.innerHTML 会混入浏览器私有标签(如 、)或冗余 style,导致后端解析失败。导出前必须遍历节点标准化:
:若子节点不含 或仅含空文本节点,整个 应被移除li 结构:把 归一为 ,避免嵌套段落ol 上的 style、data- 等非标准属性,只保留 start、type、reversed
下的 不能简单扁平化,要保留层级语义,而是用户在第三级列表里按了三次回车后,光标停在哪、缩进是否继承、导出 JSON 时怎么映射嵌套关系——这些细节不会出现在 API 文档里,但会在线上环境突然崩掉。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











