这是什么意思:“document.write('

时间:2009-09-24 21:14:04

标签: javascript html

我在每个Yahoo!上看过这个news page,位于源代码的底部,
并且无法理解为什么他们会破坏脚本这样的词。

有人知道这是否有任何原因?

document.write("<scr"+"ipt language=javascript src=http://l.yimg.com/d/lib/bc/bc_2.0.4.js></scr"+"ipt>");

6 个答案:

答案 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文本中。