我在每个Yahoo!上看过这个news page,位于源代码的底部,
并且无法理解为什么他们会破坏脚本这样的词。
有人知道这是否有任何原因?
document.write("<scr"+"ipt language=javascript src=http://l.yimg.com/d/lib/bc/bc_2.0.4.js></scr"+"ipt>");
答案 0 :(得分:39)
考虑这个简化的例子:
<script>
document.write("something </script> something");
</script>
浏览器的HTML解析器会在JavaScript字符串中看到</script>
并将其解释为脚本元素的结尾。
HTML解析器不了解JavaScript语法 - 它只知道<script>
元素在下一个</script>
结束。
(它也知道你不能拥有嵌套的<script>
元素,因此在你的例子中打开了<script>
开头以及结束</script>
。)
答案 1 :(得分:4)
假设您正在编写一个工具,用于检测一大块文本中脚本块的开头和结尾。假设你看到了
<blah><blahdeblah><script>
blah blah blah
blah
print("</script>")
print("<script>")
blah
</script>
</blahdeblah></blah>
在不知道脚本语言的语法的情况下,您的工具如何知道这是一个脚本块而不是两个脚本块,并且它们之间有“等等”?
网络浏览器就是这样一种工具。合理的做法是确保您永远不会混淆Web浏览器,因为文件中永远不会有<script>
或</script>
,除非它实际上是一个脚本标记。
答案 2 :(得分:3)
这样它就不会被评估,而是作为字符串插入。
答案 3 :(得分:3)
阻止XML / XHTML和HTML验证器对源代码大吼大叫是一种不好的方法。
答案 4 :(得分:0)
某些浏览器在解析文档时倾向于“快速行动”,并在找到脚本标记时立即尝试执行javascript(即使它本身位于js中)。为了避免这种情况,他们打破了标签的诽谤。
答案 5 :(得分:0)
有关此问题的完整讨论,请参阅:
http://www.wwco.com/~wls/blog/2007/04/25/using-script-in-a-javascript-literal/
简短的回答是,您的代码将分两个步骤进行解析。
第一个是XML。这意味着元素&lt; SCRIPT&gt;正在寻找&lt; / SCRIPT&gt;。重要的是要记住XML元素是内容不可知的。这意味着解析器不知道还那里有JavaScript。
一旦它具有&lt; SCRIPT&gt;的内容。 element,然后它处理那块文本,大概是JavaScript。
通过使用字符串连接运算符拆分标记,可以防止常量跳过XML阶段。
一个简单的解决方案是将&amp; lt;和&amp; gt;在Javascript文本中。