jQuery getScript加载与执行

时间:2014-01-17 21:52:49

标签: jquery

getScript docs说成功回调:

“一旦脚本加载但不一定执行,就会触发回调。”

但在我的测试中似乎并不属实。对于包含以下内容的主页:

var startTime = new Date();

$.getScript("test.js")
 .done(function( script, textStatus ) {
    console.log( textStatus );
    console.log( "Done callback executing now.")
  })
  .fail(function( jqxhr, settings, exception ) {
    console.log("error." );
});

加载以下“test.js”脚本,该脚本占用UI 5秒钟:

console.log("ajaxed script starting to execute.");
var newTime = new Date();
while (newTime - startTime < 5000) {
    newTime = new Date();
}
console.log("elapsed time", newTime - startTime);
console.log("ajaxed script finished executing.");

在FF&amp;中产生相同的可预测控制台输出。铬:

ajaxed script starting to execute.
elapsed time 5000 
ajaxed script finished executing.
success
Done callback executing now. 

换句话说,在加载的脚本既加载又执行之后,才会触发成功回调。这似乎是因为在jQuery source中,globalEval函数立即调用脚本:

converters: {
    "text script": function( text ) {
        jQuery.globalEval( text );
        return text;
    }
}

这些文档错了吗?如果它们是正确的,那么在执行脚本之前,成功回调会在哪些特定情况下触发

3 个答案:

答案 0 :(得分:0)

从我可以看到的来源,我同意你的结论,承诺总是解决>脚本执行后。

然而,我的记忆告诉我,在许多浏览器jQuery 1.x支持<script>之一中注入(s|ed)标签有一些奇怪之处。问题浏览器在脚本执行之前触发了加载的回调,或者我们不会在文档中添加关于它的注释。

我非常确定$.getScript的实现从那以后发生了变化,文档中的问题行不再相关,无论我们需要在jQuery核心团队面前提出问题。你真的应该在github上打开一个问题 - 随意cc @gnarf。

答案 1 :(得分:0)

这是对原始海报提交的GitHub issue回复的引用:

  带有一些Twitter媒体的

$.getScript("https://platform.twitter.com/widgets.js").done(..)将触发已完成的代码而无需等待执行发生。

因此,文档似乎是正确的,但可能并不像人们希望的那样具有描述性。

答案 2 :(得分:0)

我在1.7.1版本的jQuery中遇到过这个问题。在2.1.0版之前,前面提到的eval()函数使用臭名昭着context.head.appendChild( script ).parentNode.removeChild( script ); 的间接调用来在全局环境中运行代码。

所以这肯定是一个问题。

在2.1.0版本中,由于缺少间接eval调用,他们已切换到脚本插入。如果您愿意,可以在此处找到更多信息。

http://perfectionkills.com/global-eval-what-are-the-options/

在使用脚本插入的较新实现中,此行正在进行魔术

build and run

除非有一些奇怪的底层浏览器机制,否则在从DOM树中删除之前,似乎必须立即执行脚本