2014-01-17 47 views
12

getScript docs說一下的是,成功回調:jQuery的getScript加入負載VS執行

「一旦腳本已經加載,但不一定執行的回調解僱了。」

但在我的測試中,似乎並非如此。對於與主機頁面:

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 &鉻:

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

你可以把你的問題和減價到https://github.com/jquery/api.jquery.com/issues? :) – gnarf

+0

該文檔是絕對錯誤的,謝謝你的領導:) –

+1

謝謝,github問題提交:https://github.com/jquery/api.jquery.com/issues/420 – Ben

回答

0

從我可以告訴看着源,我同意你的結論,即承諾要始終決心後的腳本執行。

但是我的記憶告訴我,在許多瀏覽器之一中注入<script>標籤有一些奇怪的地方jQuery 1.x支持(s|ed)。問題瀏覽器在腳本執行之前觸發加載的回調,或者我們不會在文檔中添加關於它的註釋。

我非常肯定$.getScript的實現自那時以來發生了變化,文檔中的問題行已不再相關,無論我們需要在jQuery核心團隊面前獲得問題。你真的應該在github上打開一個問題 - 請隨意轉到cc @gnarf。

0

這是由原始的海報提交的GitHub issue響應報價:

$.getScript("https://platform.twitter.com/widgets.js").done(..)一些Twitter的媒體將觸發完成代碼,而無需等待執行的情況發生。

因此,文件似乎是正確的,雖然可能不如人們所希望的那樣具有描述性。

+0

嗯...我想看看那個代碼。我強烈懷疑Twitter小部件有一個超時或一些異步行爲。換句話說,該腳本已被執行,並且任何後來的相關代碼都在事件循環中發生。這意味着成功回調可能會在一些輔助操作完成之前觸發。 – Ben

0

我在1.7.1版本的jQuery中遇到過這個問題。在版本2.1.0之前,前面提到的$.globalEval()函數使用臭名昭着的eval()的間接調用來在全局環境中運行代碼。

所以它肯定是一個問題。

在版本2.1.0中,由於間接eval調用的某些缺陷,他們已切換到腳本插入。如果你喜歡,你可以在這裏找到更多信息。

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

與腳本插入新的實現這一行是做魔術

context.head.appendChild(script).parentNode.removeChild(script); 

除非有似乎腳本必須立即執行,被刪除之前,一些奇怪的底層瀏覽器機制DOM樹。