脚本标签内的HTML实体未转换?

时间:2010-11-19 17:51:36

标签: javascript xml

<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/

为什么第一个结果不同? <script>标记是否以某种方式从实体转换中排除?

2 个答案:

答案 0 :(得分:23)

在HTML中,脚本和样式元素为defined in the DTD as containing CDATA。这意味着在解析器遇到类似于结束标记的内容之前,将忽略实体和标记。

XHTML is different这些元素中的实体和标签正常运行 - 但仅在解析为XHTML时才起作用。您可以使用<![CDATA[ … ]]>将内容明确标记为CDATA。

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

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

答案 1 :(得分:11)

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

  

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