jQuery getScript 加载与执行

标签 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 和 Chrome 中产生相同的可预测控制台输出:

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;
    }
}

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

最佳答案

据我所知,查看源代码,我同意您的结论,即 promise 应该始终在脚本执行之后解决。

但是我的内存告诉我,注入(inject) <script> 有一些奇怪的地方。 jQuery 1.x 支持的众多浏览器之一中的标签 (s|ed) 。问题浏览器在脚本执行之前的某个时刻触发了加载的回调,否则我们不会在文档中添加有关它的注释。

我很确定 $.getScript 的实现从那时起已经发生了变化,文档中的问题行不再相关,无论哪种方式,我们都需要将问题提交给 jQuery 核心团队。你真的应该在 github 上打开一个问题- 请随时抄送@gnarf。

关于jQuery getScript 加载与执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21196617/

相关文章:

javascript - jQuery .on ('change' , function() {} 未在 asp.net Fileupload 控件上触发

jquery - CSS3 过渡可能存在的 Webkit 错误

jquery - 如何使用 knockout 更改表的行顺序。拖放或使用向上/向下按钮

jquery - 共享点 2013 : How to make Promoted links responsive?

javascript - 动画只有一种方式

javascript - jQuery 附加双引号无法正常工作

javascript - 在页面之间来回移动时,它保留输入值而不是 jQuery 设置的文本

javascript - CSV 数据文件到字符串数据

javascript - Kendo UI TreeView 节点在拖放后丢失自定义分配的 HtmlAttributes

javascript - 垂直多级 Accordion 菜单和 document.getElementById ("side_bar_t").innerHTML