2009-09-24 79 views

回答

39

考虑这个简单的例子:

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

浏览器的HTML解析器会看到</script>的JavaScript字符串内和解释作为脚本元素的结束。

HTML解析器不知道JavaScript语法 - 它只知道<script>元素在下一个</script>处结束。

(它也知道,你不能嵌套<script>元素,开幕<script>,以及在你的榜样收盘</script>的,因此断裂。)

+13

备注:同样的方式表现为SO中代码的着色,注意“something”被当作脚本元素之外的文本内容 – 2009-09-24 21:20:45

+1

实际上,no,SCRIPT元素在第一次出现““。请参阅:http://www.w3.org/TR/html4/types.html#type-cdata – kangax 2009-09-24 22:53:25

+1

这是旧的浏览器的解决方法,还是它适用于现代浏览器? – hasen 2009-09-25 00:54:40

3

因此,它并没有得到评估,但被插入一个字符串。

3

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

+2

那么为什么Google Analytics会使用这种方法? “document.write(unescape(”%3Cscript src ='“+ gaJsHost +”google-analytics.com/ga.js“...为什么他们甚至用document.write做到这一点我不明白 – vsync 2010-03-24 08:25:29

0

一些浏览器倾向于“采取行动”的时候要快解析一个文档,并立即尝试执行javascript时,他们发现一个脚本标记(即使它本身在一块js中)。为了避免这种情况,他们打破了标签的消除。

+0

我不太了解你刚刚说的,你能提供关于这个主题的进一步阅读吗?它非常有趣。 – vsync 2009-09-24 21:26:30

+0

假设你用IE打开一个页面,有document.write('

4

假设你正在写一个工具,检测文本块开始和脚本块的结束。假设你看到

<blah><blahdeblah><script> 

blah blah blah 

blah 

print("</script>") 

print("<script>") 

blah 

</script> 

</blahdeblah></blah> 

不知道脚本语言的语法,请问你的工具,知道这是ONE脚本块,并以“不是两个脚本块)它们之间等等?

网络浏览器是。这样的工具这是一个合理的做法,以确保您永远不会永远在你的文件<script></script>除非它实际上是一个脚本标签混淆网络浏览器

0

对于这个完整的讨论,请参阅:
    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文本中。

+2

一切都很好,除了它被解析为HTML(即SGML),而不是XML。 HTML有''。因此,这个JS技巧为什么有效。另一方面,XML只会在第一个'<'里面barf,除非你使用CDATA(如果你使用CDATA,那么你不需要JS技巧)。 – 2009-09-24 22:49:17