能,但不是“执行”,而是“绕过解析器直接当纯文本读取”。浏览器将内容视为纯文本节点保留在dom中,ie9+及所有现代浏览器均支持,且csp默认放行,是安全、通用、无副作用的数据载体。

script 标签 type="text/plain" 真的能存数据吗?
能,但不是“执行”,而是“绕过解析器直接当纯文本读取”。浏览器遇到 <script type="text/plain"></script> 时,会跳过 JS 解析和执行流程,把内容当作普通文本节点保留在 DOM 中。这是最轻量、兼容性最好的非执行脚本数据载体,IE9+ 和所有现代浏览器都支持。
怎么安全读取 type="text/plain" 里的内容
不能用 textContent 直接取 —— 某些旧版 Safari 和 IE 会把换行转成 \n 或丢空格;也不能用 innerHTML,它可能被 HTML 解析(比如含 <div> 就危险)。正确做法是遍历子节点找 <code>Text 节点:
const script = document.querySelector('script[type="text/plain"]');
let data = '';
for (const node of script.childNodes) {
if (node.nodeType === Node.TEXT_NODE) {
data += node.nodeValue;
}
}
常见错误现象:script.textContent.trim() 在 Firefox 中对缩进敏感,首尾空行可能被截断;script.innerHTML 会触发 HTML 实体解码(如 变成空格)。
type 值选 text/plain 还是 application/json 或其他
text/plain 是唯一稳妥选择。虽然有人用 application/json 或 text/template,但这些 MIME 类型在部分浏览器(尤其是旧 Edge)中仍可能触发预解析警告或被 CSP 拦截;text/plain 明确告诉浏览器“别碰它”,CSP 也默认放行。注意:不要用 type="javascript" 或空 type,那等于告诉浏览器“请执行我”。
-
text/plain:安全、通用、无副作用 -
application/json:Chrome 可能报Refused to execute script(即使没执行) -
text/x-custom:某些移动端 WebView 会忽略整个 script 标签
为什么不用 或 <script type="text/<a style=" color: text-decoration:underline title="html" href="https://m.php.cn/zt/15763.html" target="_blank">html"></script>
<template></template> 确实更语义化,但它不支持直接内联 JSON 字符串(需转义引号),且老版本 Android WebView 对 content 属性读取不稳定;text/html 则容易被 IDE 或构建工具误识别为模板并做预处理(比如 Vite 的 vite-plugin-html 会尝试解析它)。而 text/plain 是“零解释”的底线方案 —— 浏览器连字符编码都不碰,你写什么就是什么。
真正容易被忽略的是换行与空白:如果数据里有 Windows 风格换行(\r\n),在某些环境里会被 normalize 成 \n;如果 script 标签前后有空格或注释节点,childNodes 会包含它们,必须严格过滤 Node.TEXT_NODE。











