quill 类textarea 开发,自研插入纯净的表格,选中表格/代码块 → 弹窗编辑该块源码

2026-09-06 · 227 阅读
用quill 编辑器,开发类似 text area那样的 纯文本存储,尽量存纯文本,尽量少的,尽量不要多余的html标志, 功能是如下的自研插入表格
插入表格左侧1表格右侧测试
新增的「源码」按钮(选中块弹窗微调) 工具栏:blockquote, codeblock, table, source 同组(L229)。 图标:铅笔画 SVG,与 codeblock 风格一致(L302-306)。 handler(L340-374): 取 getSelection,用 getLeaf 定位光标处或紧邻前一个字符的原子块; 只认 table / codeblock 两类,否则提示"请先点击表格或代码块"; 表格弹窗编辑其 innerHTML(内部结构,不含 <table> 外层),代码块编辑其文本; deleteText + insertEmbed 原子写回,setSelection 回到该块。 与现有功能零冲突(已符合你的偏好) \n 正文:只操作编辑器端原子块,提交仍走 root.innerHTML → contentToStore 既有流程,后端零改动。 图片上传/孤儿清理:未触碰 uploader、onPaste、uploadedImages。 表格/代码块往返:value→源码→create 圆滑闭合,存库走 pre/table 保护原样透传。 -------下面是具体对齐方案过程---------- 把你想要的"HTML 源码视图"限定成「只方便微调表格/代码块」——这个定位其实非常合适,因为它们恰好是存储里唯一能"原子存活"的两类块。下面是完整拆解。 核心结论(先给结论) 后端:零改动。 源码视图只影响编辑器 DOM,提交时仍走 root.innerHTML → contentToStore(已把 pre/table 保护、其余展平为 \n)。所以存储、\n 逻辑、图片清理统统不碰。 改动集中在 1 个前端 JS(article-editor.js),加个"HTML/源码"切换 + 一个 textarea + 回切逻辑,大约 50–70 行。 edit.html 无需单独改:它和 add.html 共用 article-editor.js,自动生效。 需要改的地方(思路) 工具栏加 html 按钮 + 一个隐藏 <textarea>(JS 动态创建,不用动 add.html 标记)。 切到源码:把 quill.root.innerHTML 读进 textarea,隐藏可视化区(对 Quill 容器 display:none)。 切回可视化:把 textarea 文本经 quill.clipboard.dangerouslyPasteHTML(...) 喂回 → 走既有 matcher/白名单重建。 提交前同步(重要细节):如果当前停在源码视图没切回,直接读 root.innerHTML 会漏掉编辑;所以取内容前要先"切回可视化"再取,或同步 textarea→编辑器。这是唯一容易踩的坑,实现时处理掉即可。 稳定性评估 表格/代码块:非常稳。 因为它们是原子 embed,源码就是它们的 value,改完回写 create(value) 圆滑往返;存库还走保护块原样透传。这正是这类功能价值最大的地方。 任意 HTML 会有"回显走样":非白名单的 <div/class/style> 切回可视化时会被 Quill 丢弃/改写,存库再被 sanitizeContent 清一遍。安全上没问题(后端已有 on*/style、javascript:、iframe 域名等拦截,等同现有编辑的安全性),但会让用户觉得"我手写的 HTML 保存后没了"。 undo/history:切换视图会打断 Quill 历史栈(小影响)。 \n 完全无冲突:textarea 里的换行只是 HTML 文本,和存库 \n 无关。 工作量 最小方案(整页源码切换):改 article-editor.js 一个文件,约 50–70 行 + 少量样式。工作量小。稳定性中——表格/代码块优秀,任意 HTML 有"写入会净化的错觉"。 更可控方案(选中表格/代码块 → 弹窗编辑该块源码):需选区检测 + 弹窗,UI 略重,但只触及原子块、预测性强、完全绕开"任意 HTML 被净化"的误导。工作量中,稳定性更高。 我的建议 如果核心诉求是"微调表格/代码块",我倾向最小方案(整页切换)+ 在回切时给一句提示"非白名单内容(布局/样式)会在保存时被清理",成本低、够用;若你更在意绝不误导用户、只准动表格/代码块,就选**"选块编辑源码"**方案,实现更重但体验更精准。 The user prefers the "more controllable方案": 选中表格/代码块 → 弹窗编辑该块源码. This requires selection detection of atomic embed (table/codeblock), a modal/prompt 方向定了:**"选中表格/代码块 → 弹窗编辑源码"**,这个方案的稳定性确实最可控,且**完全不碰任何现有功能**(后端零改动,只在 editor JS 加逻辑)。 ## 实现思路(改动全在 [article-editor.js](file:///js/article-editor.js),约 50~60 行) 1. **工具栏加一个"源码"按钮**(`toolbar.addHandler`)。 2. **探测选中块**:取 `quill.getSelection()`,用 `quill.getLeaf(sel.index)` 判断当前光标落在哪个原子块: - `blotName === 'codeblock'` → 弹窗编辑其**代码文本**; - `blotName === 'table'` → 弹窗编辑其**内部结构**(`node.innerHTML`,即 `<tbody>`/`<tr><td>`,不含外层 `<table>`,避免写回时嵌套); - 否则提示"请先选中表格或代码块"。 3. **写回**:`quill.deleteText(sel.index, 1)`(原子块长度恒为 1)→ `quill.insertEmbed(sel.index, blotName, newValue)` → 选中新块。 4. **安全性**:写回内容仍会过「后端白名单 + on*/style/iframe 域名清洗」,与现有编辑同级,不会引入可执行风险。 ## 稳定性 / 冲突评估(你在意的点) - **`\n` 正文逻辑**:完全不影响——弹窗编辑的是编辑器端 HTML/文本,提交仍走 `root.innerHTML` → `contentToStore` 既有流程。 - **图片上传/孤儿清理**:不触碰 uploader、onPaste、`uploadedImages`。 - **表格/代码块往返**:原子块 value→源码→create 写回,圆滑闭合;存库仍走 pre/table 保护原样透传。 - **风险点(都很好控)**:误选了非块元素给提示;表格源码只允许编辑内部结构(已把"外层 table 嵌套"这个坑规避掉)。 ## 工作量 小。单文件 JS,纯增量,无后端、无模板改动。 如果没有别的顾虑,我就按这个实现。要我动手吗?
责任编辑:gl 更新:2026-09-06 19:43:30