这个JavaScript的目的是什么?

问题描述:

我正在玩一个基于Python的HTML解析器和分析的Stackoverflow。解析器吐上的线与这个JavaScript的目的是什么?

HTMLParser.HTMLParseError: bad end tag: "</'+'scr'+'ipt>", at line 649, column 29 

错误指向的JavaScript在网站的源下列行:

<script type="text/javascript"> 
    document.write('<s'+'cript lang' + 'uage="jav' + 'ascript" src=" [...] ">'); 
    document.write('</'+'scr'+'ipt>'); 
</script> 

([...]代替长连接,这是为除去简单)

出于好奇,是否有什么看起来像我的代码人工'混淆'的特定原因,即为什么使用document.write方法连接所有切碎的字符串?

+3

的'“”'需要被砍伤以避免HTML解析器假设它是脚本块的结尾。不知道为什么其他东西是。 – 2009-12-22 03:29:56

我认为这是打adblockers。

... + 'uage="jav' + 'ascript" src="http://ads.stackoverflow.com 
+0

是的,这看起来像是因为它在页面的广告部分。他们甚至混淆了div类名称,听起来不像广告。 :) – Jeff 2009-12-22 03:35:09

也许它会停止专门搜索脚本标记的程序。例如,广告拦截器会查找脚本标记和对象标记。

+0

有趣的是,在这个问题中,最高评分的答案和最低评分的答案是相同的。 :) – carl 2009-12-22 04:07:28

已写的方式,以避免浏览器认为它是<script>结束标记,这将导致一些问题。

+1

尽管如此,这并不能解释为什么顶线被切碎。 – 2009-12-22 03:34:19

+0

因为你不能在另一个里面写一个标签'

+0

浏览器并不关心'

当HTML解析器遇到document.write('</script>');时,它认为它已经找到包含<script>标记的末尾。打破标签停止解析器识别结束标签。

我见过的这种做法的另一种方式是转义斜杠,即document.write('<\/script>');

正确方式做,这有两种情况:

  • 附上脚本的身体处于<![CDATA[ ... ]]>块(如果服务XHTML),或
  • 把脚本在外部文件中,或
  • 使用DOM API,而不是(即创建一个脚本节点,它添加到文件头)
+1

CDATA块不会帮你在这里。如果文档以HTML格式提供并呈现,则不是。 – kangax 2009-12-22 03:52:50

+0

@ kangax - 正式指出,谢谢 – harto 2009-12-22 04:41:07