【问题标题】:HTML entities inside script tag not converted?脚本标签内的 HTML 实体未转换?
【发布时间】:2011-05-12 18:57:52
【问题描述】:
<script type="text/javascript">
    function test()    {
        alert('&lt;span&gt;blah&lt;span&gt;');
    }
</script>
<a href="#" onclick="test();">First</a><br />
<a href="#" onclick="alert('&lt;span&gt;blah&lt;span&gt;');">Second</a><br />
Third: &lt;span&gt;blah&lt;span&gt;

演示:http://jsfiddle.net/LPYTZ/

为什么第一个结果不同? &lt;script&gt; 标签是否以某种方式从实体转换中排除?

【问题讨论】:

    标签: javascript xml


    【解决方案1】:

    在 HTML 中,脚本和样式元素是 defined in the DTD as containing CDATA。这意味着实体和标签会被忽略,直到解析器遇到看起来像结束标签的东西。

    XHTML is different 以及这些元素中的实体和标签正常运行——但仅在解析为 XHTML 时。您可以使用 &lt;![CDATA[ … ]]&gt; 将内容显式标记为 CDATA。

    浏览器将使用 HTML 规则将 XHTML 视为文本/html,当您尝试编写在两组规则下都正确的代码时,这会导致一大堆讨厌的事情。

    避免问题的最简单方法是将脚本保存在外部文件中,并使用src 属性来包含它们。

    【讨论】:

    • 正如我已经 拥有 XHTML(也在 jsfiddle 中)+1 表示“浏览器将使用 HTML 规则将 XHTML 视为文本/html”部分。
    • @AndreKR:重要的是 MIME 媒体类型,而不是内容。
    • HTML5 怎么样?
    • @PedroGimeno — HTML 5 是 HTML(XHTML 除外)。
    • @Quentin,HTML 5 可能是 HTML,但 it is not SGML,因此没有 DTD。您的回复引用了 HTML5 不存在的 DTD。这就是我问的原因。
    【解决方案2】:

    是的,content model of STYLE and SCRIPT 很特别:

    尽管STYLESCRIPT 元素使用CDATA 作为其数据模型,但对于这些元素,用户代理必须以不同方式处理CDATA。标记和实体必须被视为原始文本并按原样传递给应用程序。字符序列“&lt;/”(结束标记打开分隔符)的第一次出现被视为终止元素内容的结尾。在有效文档中,这将是元素的结束标记。

    【讨论】:

    • 哈!因此,要在 JS 字符串中包含该字符序列,您需要执行以下操作:'&lt;' + '/''\u003C/'
    猜你喜欢
    • 1970-01-01
    • 2018-04-29
    • 1970-01-01
    • 2014-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-31
    相关资源
    最近更新 更多