我有以下页面
<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试过)
答案 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"
};
只是在结束脚本标记之间放置一个空格,因此它不会被解析为结束标记。