带有src和内容的脚本标记是什么意思?

usr*_*usr 114 javascript

Googles +1按钮示例:

<script type="text/javascript" src="https://apis.google.com/js/plusone.js">
      {"parsetags": "explicit"}
</script>
Run Code Online (Sandbox Code Playgroud)

脚本Tag具有src-Attribute 内容.这是什么意思,它是如何工作的?

小智 64

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

谷歌并不依赖任何特定行为.由于内容只是一个对象文字(一个值),执行它实际上不会做任何事情,除了导致无声错误.Google的代码会查看script代码本身的内容,并根据该代码调整其行为.

  • 在我使用过的所有浏览器中,如果存在`src`属性,脚本内容将永远不会被执行,并且实际上并不是对象文字,如果执行该代码将产生`SyntaxError`,它只是"JSON文本" "脚本将在以后单独使用. (10认同)
  • @jose - 你的例子不是 CMS 所指的。如果代码作为独立语句运行,则是语法错误。您的示例(和 Google 的)“有效”只是因为脚本元素的内容由于 *src* 属性而被忽略。 (3认同)
  • 有没有一种更聪明的方法让脚本查看自己的脚本标记(特别是)的内容,而不是通过DOM? (2认同)
  • @Karl在外部.js文件中使用,这将为您提供当前正在执行的<script>节点的内容:`s = document.getElementsByTagName('script'); text = s [s.length-1] .innerHTML;`我认为没有办法获取不涉及触及DOM的脚本节点的内容. (2认同)
  • @KarlKnechtel - 尝试:在“src”引用的脚本中使用“document.currentScript”来获取对脚本自己的“&lt;script&gt;”标签的引用。 (2认同)

Rob*_*obG 21

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

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

  • 为什么这不是一个好主意?如果它用于初始化第三方插件怎么办? (4认同)

Jim*_*Jim 13

根据HTML5草案规范,<script>具有src属性的元素应该只有注释掉的代码,用于为脚本提供文档.尽管Google似乎并不符合此规范.


Jam*_*ham 13

加载脚本后,它会查看自己的脚本标记以访问其内容.

它将使用类似于此的一些代码:

var scripts = document.getElementsByTagName("script");
var data = eval(scripts[scripts.length - 1].innerHTML);
Run Code Online (Sandbox Code Playgroud)

John Resig提供.