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/