这是什么意思:“document.write('
我已经在源代码的底部每个Yahoo! news page上看到这个,
并且未能理解为什么他们打破脚本字这样。
这是什么意思:“document.write('<scr'+'ipt ...”?
有谁知道是否有任何原因?
document.write("<scr"+"ipt language=javascript src=http://l.yimg.com/d/lib/bc/bc_2.0.4.js></scr"+"ipt>");
考虑这个简单的例子:
<script>
document.write("something </script> something");
</script>
浏览器的HTML解析器会看到</script>
的JavaScript字符串内和解释作为脚本元素的结束。
HTML解析器不知道JavaScript语法 - 它只知道<script>
元素在下一个</script>
处结束。
(它也知道,你不能嵌套<script>
元素,开幕<script>
,以及在你的榜样收盘</script>
的,因此断裂。)
因此,它并没有得到评估,但被插入一个字符串。
这是阻止XML/XHTML和HTML验证程序对源代码大喊大叫的不好方法。
那么为什么Google Analytics会使用这种方法? “document.write(unescape(”%3Cscript src ='“+ gaJsHost +”google-analytics.com/ga.js“...为什么他们甚至用document.write做到这一点我不明白 – vsync 2010-03-24 08:25:29
一些浏览器倾向于“采取行动”的时候要快解析一个文档,并立即尝试执行javascript时,他们发现一个脚本标记(即使它本身在一块js中)。为了避免这种情况,他们打破了标签的消除。
我不太了解你刚刚说的,你能提供关于这个主题的进一步阅读吗?它非常有趣。 – vsync 2009-09-24 21:26:30
假设你用IE打开一个页面,有document.write('
假设你正在写一个工具,检测文本块开始和脚本块的结束。假设你看到
<blah><blahdeblah><script>
blah blah blah
blah
print("</script>")
print("<script>")
blah
</script>
</blahdeblah></blah>
不知道脚本语言的语法,请问你的工具,知道这是ONE脚本块,并以“不是两个脚本块)它们之间等等?
网络浏览器是。这样的工具这是一个合理的做法,以确保您永远不会永远在你的文件<script>
或</script>
除非它实际上是一个脚本标签混淆网络浏览器
对于这个完整的讨论,请参阅:
http://www.wwco.com/~wls/blog/2007/04/25/using-script-in-a-javascript-literal/
简短的回答是,你的代码是在两个分立的步骤进行解析。
第一个是XML。这意味着元素<SCRIPT>正在寻找一个</SCRIPT >。重要的是要记住XML元素是内容不可知的。这意味着解析器不知道还有那里有JavaScript。
一旦它具有<SCRIPT>元素的内容,然后它处理文本的该块,这大概是JavaScript的。
通过使用字符串连接运算符分割标记,可以防止常量跳过XML阶段。
一个简单的解决办法是把& lt;和& gt;在Javascript文本中。
一切都很好,除了它被解析为HTML(即SGML),而不是XML。 HTML有''。因此,这个JS技巧为什么有效。另一方面,XML只会在第一个' 2009-09-24 22:49:17
备注:同样的方式表现为SO中代码的着色,注意“something”被当作脚本元素之外的文本内容 – 2009-09-24 21:20:45
实际上,no,SCRIPT元素在第一次出现“”时结束,而不仅仅是““。请参阅:http://www.w3.org/TR/html4/types.html#type-cdata – kangax 2009-09-24 22:53:25
这是旧的浏览器的解决方法,还是它适用于现代浏览器? – hasen 2009-09-25 00:54:40