srcdoc渲染富文本必须提供完整html文档结构(含doctype、html、head、body),正确转义引号,内联css/js,强制配置sandbox,并为ie提供src降级。

srcdoc 渲染富文本不是“把 HTML 字符串塞进去就完事”,它本质是加载一个完整文档,而富文本往往含用户输入、内联样式、脚本片段——不处理好结构、转义、沙箱,轻则空白,重则 XSS。
srcdoc 必须是完整 HTML 文档,不是富文本片段
直接把 editor.getValue() 返回的 "<p><strong>Hello</strong></p>" 当作 srcdoc 值,Safari 会空白,Chrome 可能乱渲染,Firefox 行为不一致。因为浏览器按完整文档解析,缺 、、 就不可靠。
- ✅ 正确结构:必须包含
<title>Preview</title>... -
<title></title>虽非强制,但缺失时旧版 Safari 可能拒绝渲染 - 未闭合标签(如
<div>hello)会导致后续内容不解析,富文本里常见自闭合错误或嵌套混乱,需先用 DOMParser 或 sanitize-<a style="color:#f60; text-decoration:underline;" title="html" href="https://m.php.cn/zt/15763.html" target="_blank">html</a> 预处理 <h3>双引号、内联 JS/CSS 必须转义且内联</h3> <p>富文本常含 <code>style="color:red"、onclick="alert(1)",这些双引号会和外层 HTML 属性冲突,不处理就截断字符串,iframe 空白无报错。- 推荐用单引号包裹整个属性:
srcdoc='<style>p{margin:0}</style> <p style="color:red">OK</p>' - 或对双引号实体转义:
srcdoc="<p style="color:red">OK</p>" -
<script src="..."></script>和<link href="...">在srcdoc中完全失效,CSS 必须用<style></style>内联,JS 必须写进<script></script>标签并放在底部或包装在DOMContentLoaded里
sandbox 是强制项,不是可选项
富文本哪怕来自你自己的编辑器,只要混入用户输入(比如粘贴的第三方代码、图片 URL、
<script></script>片段),没sandbox就等于裸奔:脚本能执行、表单能提交、window.open()能弹窗、甚至尝试修改top.location。- 仅展示静态内容:用
sandbox=""—— 脚本、表单、弹窗、存储访问全禁,<script></script>标签会被忽略 - 需运行 JS(如按钮交互、高亮代码):用
sandbox="allow-scripts",但绝不要加allow-same-origin,否则 iframe 内脚本可通过contentDocument读取父页 DOM - 若需与父页通信(如点击复制代码),只能用
window.parent.postMessage(),不能依赖window.parent.xxx
IE 不支持 srcdoc,fallback 必须显式提供
IE(包括 IE11)完全忽略
srcdoc属性,既不报错也不降级,结果就是 iframe 空白。这不是兼容性问题,是彻底不识别。- 必须同时设
src和srcdoc:<iframe src="fallback.html" srcdoc="..." sandbox="..."></iframe> - 现代浏览器优先用
srcdoc,IE 回退到src指向的静态 HTML 文件(可预生成或服务端渲染) - 用 data URL(
src="data:text/html;charset=utf-8;base64,...")可行,但注意部分浏览器 URL 长度限制约 2MB,富文本长了容易截断
真正麻烦的不是拼字符串,而是富文本里那些看不见的陷阱:未转义的双引号、漏闭合的标签、带
javascript:的href、onerror事件——这些都得在注入前清洗,而不是靠sandbox拦住。安全不是加个属性就完事,是每一步都得有意识地切掉攻击面。 - 推荐用单引号包裹整个属性:











