具有src AND内容的script-Tag是什么意思?


122

Google +1按钮的示例:

<script type="text/javascript" src="https://apis.google.com/js/plusone.js">
      {"parsetags": "explicit"}
</script>

脚本标签具有src属性内容。这是什么意思,如何运作?


Firebug Lite使用此方法: getfirebug.com/firebuglite
Brad

Answers:


71

不同的浏览器对此有不同的对待。有些仅在src没有错误的情况下运行内容。有些尝试在尝试包含src脚本之后运行它,无论是否成功。由于这种行为是不可靠的(在HTML5中禁止的),因此应避免这种行为。

Google并不依赖任何特定行为。由于内容只是对象文字(值),因此执行内容实际上不会做任何事情,只会导致静默错误。Google的代码查看script标记本身的内容,并根据该内容调整其行为。


2
与遍历DOM相比,脚本有没有一种更聪明的方法来查看其自己的脚本标签的内容(特别是)?
Karl Knechtel

11
在我使用过的所有浏览器上,如果src属性存在,脚本内容将永远不会执行,并且实际上不是真正的对象文字,SyntaxError如果执行,该代码将产生一个“ JSON文本”,脚本将使用以后自己。
CMS

2
@Karl在外部.js文件中使用,这将为您提供当前正在执行的<script>节点的内容: s=document.getElementsByTagName('script'); text = s[s.length-1].innerHTML; 我认为没有任何方法可以获取不涉及DOM的脚本节点的内容。
digitalbath 2011年

@CMS适用于除IE之外的所有浏览器。您可以在这里
Jose Faeti

1
@jose-您的示例不是CMS所指的。如果代码作为独立的语句运行,则是语法错误。您的示例(和Google的示例)“有效”的原因仅是由于src属性忽略了脚本元素的内容。
RobG 2011年

23

如果脚本元素具有src属性,则必须忽略该内容,否则任何其他行为都是不符合要求的。

在博客中建议(作为一种技巧)将内容放入知道不会被评估的元素中,然后使用DOM方法获取内容作为字符串,并将其评估或将其插入新的脚本元素中。这些都不是个好主意。


4
为什么这不是一个好主意?如果用于初始化第三方插件怎么办?
thekingoftruth 2014年

13

根据HTML5草案规范<script>具有src属性的元素应仅具有注释掉的代码,该代码旨在为脚本提供文档。不过,看起来Google似乎并不符合此规范。


13

脚本加载后,它会在自己的脚本标签中查找以访问其内容。

它将使用类似于以下代码:

var scripts = document.getElementsByTagName("script");
var data = eval(scripts[scripts.length - 1].innerHTML);

John Resig提供

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.