javascript 的 set 可配合 dom 操作实现基于特征的 html 标签去重,如按标签名+关键属性组合或规范化 html 字符串去重,避免冗余嵌套与重复格式,提升富文本编辑器结构清晰度与渲染效率。

在富文本编辑器中处理剪贴板粘贴的 HTML 时,重复标签(如多个 <span style="color:red"></span> 嵌套、冗余的 <div><div> 或连续相同的格式标签)会影响结构清晰度和后续渲染/序列化。JavaScript 的 <code>Set 本身不能直接“解析 HTML”或“去重标签”,但它可作为轻量、高效的工具,配合 DOM 操作完成**基于特征的标签去重逻辑**——比如按标签名+关键属性组合去重,或按规范化后的 HTML 字符串去重。
用 Set 记录已见过的标签特征,跳过重复节点
粘贴后通过 DOMParser 解析 HTML 片段,遍历所有元素节点,提取唯一标识(如 tagName + class + style.cssText 的哈希),用 Set 缓存。遇到已存在标识的节点,可跳过插入、合并样式或降级为文本。
- 不直接比较原始 HTML 字符串(易因空格、属性顺序不同误判)
- 推荐标准化:转小写 tagName、清理 style(只留非空声明)、归一化 classList
- 示例标识生成:
`${el.tagName.toLowerCase()}:${[...el.classList].sort().join(' ')}:${cleanStyle(el.style)}`
对内联样式标签做合并去重(如连续的 )
富文本常出现嵌套或相邻相同语义标签(如 <strong><strong>text</strong></strong>)。可用 Set 辅助记录当前上下文中的“活跃格式类型”,结合树遍历实现扁平化合并。
- 深度优先遍历时,用
Set维护当前路径上启用的格式类型('bold','italic'等) - 遇到新
<strong></strong>时,若set.has('bold')已为 true,则跳过创建新节点,仅继承父级样式 - 适合与
Range/NodeIterator配合,在构建新 DOM 前过滤
基于规范化 HTML 字符串的 Set 去重(适合简单场景)
若业务允许轻量处理(如纯前端预览、非生产环境清洗),可将每个标签的“最小化表示”转为字符串塞进 Set,再比对去重。
- 提取单个元素的精简 HTML:
el.outerHTML.replace(/\s+/g, ' ').trim()+ 移除注释、script/style 标签 - 注意:此法对动态属性(如
data-id)敏感,需提前剔除或忽略 - 适合一次性批量处理粘贴内容,不建议用于高频实时编辑
实际粘贴事件中集成 Set 去重的典型流程
监听 paste 事件 → 阻止默认行为 → 读取 clipboardData.getData('text/html') → 解析为 DocumentFragment → 遍历节点并用 Set 过滤 → 插入编辑器 DOM。
-
Set实例应在每次粘贴时新建,避免跨次污染 - 去重粒度按需选择:整个元素、特定标签(如只处理
<span></span>)、还是属性组合 - 慎用全量 outerHTML 去重——它无法识别语义等价但写法不同的标签(如
<b></b>和<strong></strong>)











