2013-07-28 49 views
1

我使用jQuery的getScript()加載單獨的JavaScript文件。這些文件似乎加載正常(我知道這是因爲當我把一個不正確的URL,它會引發錯誤 - 沒有錯誤的正確的URL)。jQuery的getScript()不解決

但是,done()函數似乎不起作用。控制檯不會記錄「完成」,也不會調用任何函數。

(function($) { 
    $.when(
     $.getScript(templateUrl + "/assets/js/variables.js"), 
     $.getScript(templateUrl + "/assets/js/functions.js"), 
     $.getScript(templateUrl + "/assets/js/events.js"), 
     $.Deferred(function(deferred){ 
      $(deferred.resolve); 
     }) 
    ).done(function(){ 

     console.log("done"); 

     swapBackgroundImgs(); 
     singleLarge(); 
     bindFlexorder(); 
     bindSvgeezy(); 
     bindPlaceholder(); 
     preloadImages(); 

    }); 
})(jQuery); 

回答

1

done回調永遠不會觸發,因爲你已經明確創建一個Deferred和未曾解決它。 $.when等待全部的承諾有待解決。

你在$.Deferred有的代碼:

$(deferred.resolve); 

...將安排Deferredresolve功能爲ready回調,但功能將調用與錯誤thisdocument而不是Deferred對象;更多:Mythical methods),這可能會導致錯誤ready掩埋。

只需刪除該$.Deferred完全,或者如果你的目標是要等待ready,確保this得到正確設置調用resolve時:

$.Deferred(deferred) { 
    $(function() { 
     deferred.resolve(); 
    }); 
}) 

或:

$.Deferred(deferred) { 
    $($.proxy(deferred.resolve, deferred)); 
}) 

或者,但要注意評論:

$.Deferred(deferred) { 
    // Deprecated in jQuery 1.8 
    $(document).on("ready", deferred, "resolve"); 
}) 
+0

你說過的話很有道理。我從[這個堆棧](http://stackoverflow.com/a/11803418/997596)發現了多個getScript(),這就是爲什麼我的代碼是這樣的。我已經移除了'$ .Deferred',但'done()'中仍然沒有被調用。這與jQuery函數包裝器有什麼關係? – Fisu

+0

@tommyf:這不是因爲你已經顯示的代碼中的包裝器,但如果你也在你加載的腳本中使用這個包裝器,那麼是的:這些腳本中的函數將不可訪問,因爲它們將很好地包含在範圍函數中。你必須以某種方式使它們可用,或許通過一個可用作全局變量的單獨共享對象('var App = {};'然後將它們自己添加到'App'),或者讓它們在現有的全局('document.body')將引用傳遞給偵聽器。 –

+0

加載的腳本全部解包。通過web檢查器,我可以看到加載的腳本全部都可以在'XHRs'目錄中看到。他們可以從那裏訪問嗎? – Fisu