blockElements 配置项会移除整块元素及其所有子节点(含文本),不保留内容;实现“删标签但留内容”需用 allowElements 白名单仅允许可信内联标签,依赖浏览器对文本节点的自动提升。

Sanitizer 的 blockElements 不会保留内容,这是常见误解
直接说结论:blockElements 配置项的作用是「移除整块元素及其所有子节点」,包括文本内容。它不是“剥离标签但留文字”的工具。如果你期望像 <div>hello</div> 变成 hello,用 blockElements: ['div'] 是做不到的——实际结果是整个节点被丢弃,hello 也会消失。
想保留内容就得用 allowElements 白名单模式
HTML Sanitizer 的设计逻辑是“默认拒绝,显式允许”。真正能达成“删标签但留内容”效果的方式,是配合 allowElements 明确列出你**愿意保留的内联标签**(如 'span'、'em'、'strong'),再让其他所有块级标签('div'、'p'、'section' 等)自然被过滤掉——而它们的文本子节点,在父节点被移除时,**会被提升到上层并保留**(前提是上层容器本身在白名单中,或为默认允许的文本上下文)。
实操建议:
- 不要设
blockElements,它不支持内容提升语义 - 用
allowElements: ['br', 'em', 'strong', 'span', 'a']这类安全内联标签 - 确保输入 HTML 的结构合理:比如避免
<div><p>text</p></div>套叠,否则外层div被拒后,p仍因不在白名单中被二次过滤 - 若需保留换行,
<br>必须显式加入allowElements,否则会被抹掉
遇到嵌套块级标签时,内容丢失是预期行为
例如处理这段 HTML:
<article><header><h1>Title</h1></header><p>Content</p></article>即使你只希望去掉
article 和 header,保留 Title 和 Content,仅靠配置无法实现。因为 h1 和 p 默认不在白名单中,且它们的父容器被移除后,浏览器 sanitizer 不会自动将文本“提级”两次。结果往往是空字符串或只剩孤立的 <br>。
立即学习“前端免费学习笔记(深入)”;
这时候必须预处理:用 DOMParser 先解析,手动提取文本或替换节点,再交给 Sanitizer 处理纯内联结构。
Chrome 125+ 的 Sanitizer 不支持自定义节点提升逻辑
目前所有浏览器实现(包括 Chrome 125+ 和 Safari TP)都严格遵循 W3C Sanitizer spec,没有钩子函数、不支持插件式转换、也不提供类似 “drop tag but keep children” 的配置开关。所谓“保留内容”,本质依赖于浏览器对「被移除节点的子文本节点是否可继承到父级」的内部处理——而这只在简单扁平结构下可靠(如 <p>abc<em>def</em>ghi</p> 中,若 p 被拒但 em 在白名单,则 abc 和 ghi 会作为 Text 节点保留在 sanitizer 输出的 DocumentFragment 根下)。
复杂结构、混合块/内联、或含 script/style 的场景,别指望配置解决——得自己写节点遍历逻辑,或者换用 DOMPurify 这类可扩展的库。


















