javascript - html注入(inject)中的jQuery脚本执行顺序

标签 javascript jquery html asynchronous

考虑以下 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 文件之前执行该标记)。

最佳答案

这不是 jQuery 特定的行为,而是浏览器的行为。加载文档中预定义的脚本时,它们会按顺序或外观加载。当您将脚本标记动态附加到文档时,情况并非如此。

如果您加载了如图所示的 JavaScript 文件,当 DOM 设置元素的源时,它将开始下载外部文件。

示例:

Html 文件头部的脚本

$(function() {
    var html = '<script>$("body").append("a");<\/script>' +
               '<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/jquery-ui.min.js"><\/script>' +
               '<script>$("#my-dialog").dialog();<\/script>';

    $("body").append(html);
}

Html 文件的主体元素

<div id="my-dialog">
    Some content here
</div>

上面的代码不会按照您的预期执行。 a 将被附加到正文,然后加载 jQuery.ui,最后会出现一个 dialog,但实际上第三个脚本将失败是因为 jQueryUI 尚未完成下载且尚未解析。现在,如果您在控制台中输入 $("#my-dialog").dialog(); ,则不会出现任何问题,因为此时文件已下载并解析。

这是模块加载器流行的主要原因之一。您只需告诉它需要什么,它就会按照所需的顺序为您加载它们。

您可以阅读有关 W3C 脚本规范的更多信息 here .

关于javascript - html注入(inject)中的jQuery脚本执行顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21484439/

相关文章:

javascript - 原型(prototype)通过标签函数获取

javascript - 在 react 应用程序中的页面加载期间加载配置数据

javascript - 过滤数据后打开模态 Bootstrap

Javascript,-100% 的视口(viewport)不是像素

javascript - 理解此语法 if(obj[x])

javascript - 使用 HTML 在少数页面中重用垂直按钮组

javascript - FullCalendar 插件 dayClick 不起作用

javascript - 如果我在 Filter() 函数中使用索引,会出现 undefined reference 错误吗?

javascript - 使用 Browser Profile Enterprise 设置时 IE11 的 Twitter Bootstrap 问题

css - Bootstrap 网格使用轮廓重叠