为什么要验证js字符串中的标记

时间:2010-08-18 07:25:03

标签: javascript

我有以下页面

<html>
<head>
    <script type="text/javascript" src="e01.js"></script>
</head>
<body>
<script type="text/javascript">
var obj={someHTML: "<script>alert('a');</script>rest of the html",  
               someOtherAttribute:"some value"};
    alert(obj.someHTML);
</script>
</body>
</html>

在我的对象的someHTML属性中,我在字符串中有</script>标记。但是浏览器将其读作实际的关闭标记并关闭脚本元素。这里有什么我想念的吗? (用ff和chrome试过)

4 个答案:

答案 0 :(得分:5)

HTML之前解析并独立于Javascript。当前的浏览器行为是,一旦找到打开的标记<script>,浏览器将切换到“脚本数据状态”并将所有后续数据解释为脚本,直到找到</script>

检测到</script>无关紧要 - 在JS字符串,JS注释,CDATA部分甚至HTML注释中。

您需要使字符串看起来不像HTML解析器</script>。最简单的方法是在@Daniel的答案中写<\/script>

答案 1 :(得分:3)

您可能想要转义脚本标记,如下所示:<\/script>

var obj= {
   someHTML: "<script>alert('a');<\/script>rest of the html",  
   someOtherAttribute: "some value"
};

相关文章:

答案 2 :(得分:3)

你可以逃脱&lt;和&gt;分别由&amp; lt;和&amp; gt;或将整个脚本放在CDATA部分:

<script type="text/javascript">
<![CDATA[
var obj={someHTML: "<script>alert('a');</script>rest of the html",  
               someOtherAttribute:"some value"};
    obj(some.pageButtonScript);
]]>
</script>

答案 3 :(得分:0)

另一种方法就是这样做。

 var obj= {
 someHTML: "<script>alert('a');</scr"+"ipt>rest of the html",  
 someOtherAttribute: "some value"
 };

只是在结束脚本标记之间放置一个空格,因此它不会被解析为结束标记。