为什么在用 document.write() 编写<script> 标签时拆分它?

2022-08-30 00:16:41

为什么有些网站(或给客户端提供javascript代码的广告商)采用在调用中拆分和/或标签的技术?<script></script>document.write()

我注意到亚马逊也这样做,例如:

<script type='text/javascript'>
  if (typeof window['jQuery'] == 'undefined') document.write('<scr'+'ipt type="text/javascript" src="http://z-ecx.images-amazon.com/images/G/01/javascripts/lib/jquery/jquery-1.2.6.pack._V265113567_.js"></sc'+'ript>');
</script>

答案 1

</script>必须将其分解,否则会过早结束封闭块。实际上,它应该在 和 之间拆分,因为脚本块应该(根据 SGML)由任何结束标记打开 (ETAGO) 序列终止(即 </<script></script></

尽管 STYLE 和 SCRIPT 元素将 CDATA 用于其数据模型,但对于这些元素,用户代理必须以不同的方式处理 CDATA。标记和实体必须被视为原始文本,并按原样传递给应用程序。字符序列 “” (结束标记打开分隔符) 的第一次出现被视为终止元素内容的结尾。在有效文档中,这将是元素的结束标记。</

但是,在实践中,浏览器只在实际的关闭标记上结束解析 CDATA 脚本块。</script>

在 XHTML 中,没有对脚本块进行这种特殊处理,因此它们中的任何(或)字符都必须与任何其他元素中的字符相同。但是,将XHTML解析为老式HTML的浏览器会感到困惑。有一些涉及 CDATA 块的解决方法,但最简单的方法是避免使用这些未转义的字符。从脚本编写脚本元素的更好方法是:<&&escaped;

<script type="text/javascript">
    document.write('\x3Cscript type="text/javascript" src="foo.js">\x3C/script>');
</script>

答案 2

以下是我在想要内联生成脚本标记(因此它立即执行)而不需要任何形式的转义时使用的另一种变体:

<script>
    var script = document.createElement('script');
    script.src = '/path/to/script.js';
    document.write(script.outerHTML);
</script>

(注意:与网络上的大多数示例相反,我既没有设置封闭标签,也没有设置生成的标签:没有浏览器没有将其作为默认值,因此它是多余的,但如果您不同意,也不会造成伤害)。type="text/javascript"