【问题标题】:What does a script-Tag with src AND content mean?带有 src AND 内容的 script-Tag 是什么意思?
【发布时间】:2011-09-25 13:54:25
【问题描述】:

来自 Google +1 按钮的示例:

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

脚本标签有一个src-Attribute 内容。这是什么意思以及它是如何工作的?

【问题讨论】:

标签: javascript


【解决方案1】:

不同的浏览器对此有不同的处理方式。仅当包含src 且没有错误时,某些内容才会运行。有些人在尝试包含src 脚本后运行它,无论成功与否。由于这种行为不可靠(和prohibited in HTML5),因此应该避免。

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

【讨论】:

  • 有没有比通过 DOM 更聪明的方式让脚本(特别是)查看自己的脚本标签的内容?
  • 在我使用过的所有浏览器上,如果存在src 属性,脚本内容将永远不会被执行,并且实际上不是真正的对象文字,该代码将产生SyntaxError如果执行,它只是脚本稍后将自己使用的“JSON 文本”。
  • @Karl 在外部 .js 文件中使用,这将为您提供当前正在执行的
  • @jose - 你的例子不是 CMS 所指的。如果代码作为独立语句运行,则为语法错误。您的示例(和 Google 的)“有效”只是因为脚本元素的内容由于 src 属性而被忽略。
  • @KarlKnechtel - 在你的“src”引用脚本中尝试:document.currentScript,以获取对脚本自己的“
【解决方案2】:

如果script element 具有src 属性,则内容必须 被忽略,任何其他行为都是不合格的。

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

【讨论】:

  • 为什么这不是一个好主意?如果是用来初始化第三方插件呢?
  • 老话题,但要回答@thekingoftruth 的问题:html 可以被客户端编辑,所以通过 eval 运行它意味着让用户能够运行任意代码,这是一个巨大的安全漏洞。
  • @FedericoS — 无论如何,用户都可以运行任意代码,我认为 eval 方法本身不存在安全问题。考虑到有更优雅的方式来选择性地加载代码,这更加不整洁和效率低下,尽管一段时间以来一直流行将所有内容以及厨房水槽转储到第一页并希望缓存在此后提供一些效率。例如。 Qantas 的主页为 24 mB。
【解决方案3】:

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

它会使用一些类似这样的代码:

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

感谢John Resig

【讨论】:

  • 为什么不直接document.currentScript
【解决方案4】:

根据HTML5 draft specification,具有src 属性的&lt;script&gt; 元素应该只具有注释掉的代码,旨在为脚本提供文档。不过,Google 似乎并不符合此规范。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-03
    • 2023-03-27
    • 2023-03-27
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-20
    相关资源
    最近更新 更多