新版编辑器HTML支持基于白名单和运行时过滤,禁用script、iframe、onerror等危险标签与属性;仅允许语义安全标签如b、i、ul、table等,div和span需后端显式开启;class须预配置且受CSS支持限制,style基本被全禁;所有执行性代码在提交前被sanitizer强制移除。

新版编辑器对 HTML 的支持不是“全放开”,而是有明确白名单和运行时过滤机制——直接写 <script></script>、<iframe></iframe> 或内联 onerror 事件会被静默剥离,不是失效,是压根不会进入 DOM。
哪些 HTML 标签能用?看编辑器的白名单配置
新版编辑器通常基于类似 DOMPurify 的净化逻辑,默认只保留语义安全的标签。常见可用标签包括:<b></b>、<i></i>、<u></u>、<sub></sub>、<sup></sup>、<ol></ol>、<ul></ul>、<li>、<blockquote></blockquote>、<pre class="brush:php;toolbar:false;"></pre>、<code>、<table>、<code><tr>、<code><td>、<code><th>。但注意:<code><div> 和 <code><span></span> 是否允许,取决于后端是否在白名单中显式开启——很多部署默认禁用它们以防止样式逃逸。
- 用
<pre class="brush:php;toolbar:false;"><code></code> 写代码块时,必须成对闭合,且中间不能混入未转义的 <code> 或 <code>></code>,否则整段被截断</code></pre> <table> 中禁止出现 <code>style="width:100%"这类内联样式,宽度需靠 class 控制(如果编辑器支持 class 白名单)-
<img alt="html语句的应用_新版编辑器支持html语句变化【详解】" >只允许src和alt属性,onload、data-src等一概被删 - 想加颜色或字体大小?改用语义化标签:
<span style="color:red"></span>→ 改写为<font color="red"></font>(如果编辑器仍支持<font></font>)或依赖编辑器内置 toolbar 按钮 - 自定义 class 必须提前在编辑器初始化时通过
allowedClasses配置项声明,否则 runtime 会过滤掉 - 某些编辑器(如 TipTap)用 ProseMirror 底层,class 是通过 NodeSpec 的
addAttributes显式注册的,硬写无效 -
<script>alert(1)</script>→ 整个 script 标签连同内容被删除 -
<button onclick="doIt()">点我</button>→onclick属性被删,只剩<button>点我</button> -
<a href="javascript:alert(1)">链接</a>→href值被重写为#,防止 JS 执行 - 想实现交互?必须走编辑器插件机制,比如注册自定义 node 或用 data 属性配合外部 JS 监听(前提是该 data 属性在白名单里)
class 和 style 怎么生效?得看后端策略
不是所有 class 都有效。class="highlight" 能否起作用,取决于两个条件:前端 CSS 是否定义了该类,且后端净化器是否允许该 class 名通过。多数生产环境只放行有限几个 class,如 ql-align-center(Quill 衍生编辑器常用)、language-javascript(用于代码高亮)。style 属性则基本被全禁——即使写了 style="color:red",也会在保存前被移除。
为什么 <script> 和 onclick 一粘就消失?</script>
这不是 bug,是强制安全策略。新版编辑器在内容提交前会调用 HTML sanitizer(例如 DOMPurify.withConfig),自动移除所有含执行能力的节点和属性。你看到的“没反应”,其实是内容还没发出去就被切掉了。
立即学习“前端免费学习笔记(深入)”;
真正容易被忽略的是:HTML 输入后的实时预览和最终渲染可能走两套解析流程——编辑器内部用 Quill/ProseMirror 渲染,而详情页可能用服务端 Markdown 转 HTML + 净化,导致同一段 HTML 在两边表现不一致。上线前务必在发布态下实测,别只信编辑器里的“所见即所得”。


















