Javascript 这是什么意思;文件。编写(';<;scr';+;';ipt…);?

Javascript 这是什么意思;文件。编写(';<;scr';+;';ipt…);?,javascript,html,Javascript,Html,我在每个Yahoo!上都看到过这一点,在源代码的底部, 我不明白他们为什么会这样打破剧本。 有人知道这有什么原因吗 document.write("<scr"+"ipt language=javascript src=http://l.yimg.com/d/lib/bc/bc_2.0.4.js></scr"+"ipt>"); document.write(“”); 这样就不会对其求值,而是将其作为字符串插入。防止XML/XHTML和HTML验证程序对源代码大喊大叫是一种

我在每个Yahoo!上都看到过这一点,在源代码的底部,
我不明白他们为什么会这样打破剧本。

有人知道这有什么原因吗

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

这样就不会对其求值,而是将其作为字符串插入。

防止XML/XHTML和HTML验证程序对源代码大喊大叫是一种不好的方法。

考虑以下简化示例:

<script>
document.write("something </script> something");
</script>

记录。写(“某物”);
浏览器的HTML解析器将看到JavaScript字符串中的
,并将其解释为脚本元素的结尾

HTML解析器不知道JavaScript语法,只知道
元素在下一个
结束


(它还知道,您不能有嵌套的
元素,因此在您的示例中,开头的
和结尾的
都会被破坏。)

一些浏览器在解析文档时往往“动作”过快,在找到脚本标记时会立即尝试执行javascript(即使它本身在一段js中)。为了避免这种情况,它们会破坏标记的贴花。

假设您正在编写一个工具,用于检测文本块中脚本块的开头和结尾。假设您看到

<blah><blahdeblah><script>

blah blah blah

blah

print("</script>")

print("<script>")

blah

</script>

</blahdeblah></blah>

废话废话
废话
打印(“”)
打印(“”)
废话
在不知道脚本语言语法的情况下,您的工具如何知道这是一个脚本块而不是两个脚本块之间有“)废话


web浏览器就是这样一种工具。一种合理的做法是确保您永远不会因为文件中没有
而混淆web浏览器,除非它实际上是一个脚本标记。

有关此方面的详细讨论,请参阅:

简而言之,您的代码分为两个独立的步骤进行解析

第一个是XML。这意味着元素正在寻找一个新的元素。重要的是要记住XML元素是内容不可知的。这意味着解析器还不知道其中有JavaScript

一旦它有了元素的内容,它就会处理该文本块,这可能是JavaScript

通过使用字符串连接运算符拆分标记,可以防止常量在XML阶段出错


一个简单的解决方案是在Javascript文本中放入and。

注意:同样的方法也会对SO中的代码着色。请注意,“something”被视为脚本元素之外的文本内容。实际上,不,脚本元素在第一次出现“something”时结束这是旧浏览器的一种变通方法,还是适用于现代浏览器?@hasen j:它适用于现代浏览器-我的例子在Firefox 3.5中出错了。我不太明白你刚才说的话,你能提供关于这个主题的进一步阅读吗?这非常有趣。假设你用IE打开一个有文档的页面。write(“”);然后想,“嘿,一个脚本标记!”然后执行该代码(因为它认为它只是一个内联脚本块)。但实际上,document.write('一切都很好,只是它被解析为HTML(即SGML)HTML对
有非常具体的措辞,它基本上说它必须解析内容,忽略任何提到的未浏览的
&
,直到它看到
。因此,为什么这个JS技巧有效。另一方面,XML一开始就会呕吐
,那么谷歌分析为什么使用这种方法呢如果不好?“document.write(unescape(“%3Cscript src=”)+gaJsHost+“google analytics.com/ga.js”…他们为什么还要用document.write来写呢?我不明白。