【发布时间】:2014-01-31 16:00:46
【问题描述】:
考虑以下 JS 代码:
var html = '<script>$("body").append("a");</script>'
+ '<script src="script.js"></script>'
+ '<script>$("body").append("c");</script>';
$("body").append(html);
并假设 script.js 包含以下内容:
$("body").append("b");
似乎确实,“a”、“b”和“c”被附加到正文(按此顺序)。而且,显然,“c”仅在 script.js 完成加载后附加到正文(例如,如果 script.js 需要 5 秒完成加载,“c”将仅在 5 秒后附加到正文) .
我的问题如下:我们可以依赖 jQuery 中的这种行为吗?它是确定性的还是我们可能会遇到不可预知的情况?
这对于动态加载使用尚未加载的 .js 文件的脚本很有用。您可以假设 script.js 实际上包含function f(){},而第三行应该是<script>f()</script>。如果脚本加载/执行的顺序始终相同,则不会有任何问题,否则您可能会遇到f is not defined 异常(如果在加载 script.js 文件之前执行了标记)。
【问题讨论】:
-
您应该避免注入包含
<script>元素的字符串,因为这不是脚本管理的合理架构方法。 jQuery 有一个$.getScript()方法,它明确地用于加载脚本,并利用 Promise 以便您可以轻松地链接脚本包含:$.getScript('foo.js').done(function () {$.getScript('bar.js')}); -
管理脚本依赖关系的更好方法是依赖requirejs等工具。
标签: javascript jquery html asynchronous