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;
}
}
这些文档错了吗?如果它们是正确的,那么在执行脚本之前,成功回调会在哪些特定情况下触发?
答案 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树中删除之前,似乎必须立即执行脚本 。