2013-04-12 15 views
1

正如它的標題我有一個window.load行說:執行代碼,如果內容需要更長的時間比7S加載

$(window).load(function() { 
    //Some Code 
}); 

因此,一旦一切都裝我執行//Some Code,但是我想這樣做,如果內容沒有加載,讓說,在7秒內(也許大圖像文件,或丟失文件發生等),比執行//Some Code,即使內容未完全加載。 我該如何完成這項任務?

+1

丟失的文件可以用'img.onerror = function(){...}'來檢測。 –

回答

4

你可以這樣做:

function someCode() { 
    if (someCode.done) return; 
    someCode.done = true; 
    clearTimeout(t); 
    // Some Code 
} 
var t = setTimeout(someCode, 7000); 
$(window).load(someCode); 
+0

所以我假設代替dosomething,我需要把相同的代碼放在我的window.load中,對嗎?有什麼辦法不需要重複的代碼? – Ilja

+0

@IlyaKnaup我不完全相信我明白你的意思。代碼現在是你想要的嗎? –

+0

@IlyaKnaup不,你應該把你的代碼放在* someCode函數中。這樣就沒有代碼重複。代碼的其餘部分可以在銷燬時寫入。 – Yoshi

2

由於遞延對象只能一次解決,這可以作爲一個解決方案:

var runCodeDeferred = $.Deferred(function(deferred){ 
    $(window).load(deferred.resolve); 
    setTimeout(deferred.resolve,7000) 
}); 

runCodeDeferred.done(function(){ 
    //Some Code 
}); 

同樣可以用$.Callbacks對象來完成:

var callbacks = $.Callbacks("once"); 
$(window).load(callbacks.fire); 
setTimeout(callbacks.fire,7000); 
callbacks.add(function(){ 
    //Some Code 
}); 

但是它與做:

var timer; 
function someCode() { 
    //Some Code 
} 
$(window).on("load.someCode",function(){ 
    clearTimeout(timer); 
    someCode(); 
}); 
setTimeout(function(){ 
    $(window).off("load.someCode"); 
    someCode(); 
},7000); 
+0

他們都把這個把戲對嗎?你認爲哪一個是更優雅的解決方案?我在想回調? – Ilja

+0

好吧,使用延期或回調在我看來看起來更清潔,但比使用第三種選擇或銷燬方法花費更多。我這樣做的三種方式背後的想法是保持負載邏輯在'// Some Code'區域之外,以保持簡單。 –

相關問題