contenteditable="plaintext-only" 并非可靠纯文本方案,推荐监听 input 事件实时校验并配合 paste 拦截与光标恢复。

contenteditable 本身不提供“纯文本输入”的安全保证,设置为 "plaintext-only" 是最接近的原生方案,但兼容性差、行为不稳定——别指望它能兜底。
用 contenteditable="plaintext-only" 的实际效果
这个值在 Chrome/Edge 120+ 和 Safari 17+ 中支持,Firefox 仍不支持(截至 2026 年 8 月)。启用后:
- 粘贴富文本时会自动转为纯文本(但可能丢失换行、缩进等)
- 无法通过
document.execCommand插入格式(如加粗、链接) - 仍可能因浏览器 bug 出现光标漂移、粘贴后内容重复、
<br>残留等问题 - 对拖拽文本、语音输入、系统级粘贴(如 macOS 的「粘贴并匹配样式」)无约束力
监听 input 事件做实时校验(推荐主用)
这是目前最可靠、跨浏览器一致的方式。关键点是:必须监听 input,不是 keydown 或 paste 单独处理。
将调研报告、方案对比、数据分析、需求梳理、会议纪要、设计说明、代码评审、学习笔记等任务产物输出为可在浏览器直接打开的单文件 HTML,替代 Markdown 作为最终交付物。Markdown 在信息密度、视觉清晰度和可分享性上已跟不上 AI 产物的丰富度,HTML 能同时承载排版、表格、SVG 等。
-
input覆盖所有变更入口:键盘、粘贴、拖拽、语音、剪贴板 API 调用 - 每次触发后立即读取
element.textContent,对比正则或长度规则 - 非法内容还原时,用
element.textContent = prevText,而非innerHTML—— 后者会重置光标位置 - iOS Safari 下
input可能双发,建议加setTimeout(() => { /* 校验逻辑 */ }, 0)去抖 - 若需保留换行,用
textContent.replace(/\r\n|\r|\n/g, '\n')统一,再限制总长度
拦截 paste 事件强制转纯文本
仅靠 input 监听不够,因为粘贴瞬间 DOM 已含 HTML 标签,用户会看到一闪而过的富文本。
- 必须在
paste事件中调用event.preventDefault() - 用
event.clipboardData.getData('text/plain')获取干净字符串('text/html'在部分浏览器返回空或乱码) - 手动插入纯文本:
document.execCommand('insertText', false, plainText)(已废弃但仍有用),或更现代的getSelection().getRangeAt(0).insertNode(document.createTextNode(plainText)) - 注意:Safari 对
clipboardData权限较严,首次粘贴可能返回空,需 fallback 到input后二次清洗
别忽略光标和用户体验细节
纯文本限制下最容易被忽视的不是输入控制,而是 DOM 状态同步问题:
- 每次
textContent修改都会重置光标到末尾,需用getSelection()+range手动恢复位置(尤其在删除、中间插入时) - 禁用
spellcheck="false",避免拼写检查干扰光标行为 - 避免在
input中直接操作innerHTML,哪怕只为了删标签——这会触发浏览器重建子节点,导致光标跳脱、焦点丢失 - 如果元素内有零宽字符(如
\u200B),校验逻辑要提前过滤,否则会影响长度判断和光标定位
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










