2012-11-13 167 views
28

我在寫Javascript腳本。 這個腳本可能會被異步加載(AMD格式)。如何知道窗口「加載」事件是否已被觸發

在這個腳本中,我想在window.load事件被觸發之前不做任何重要的事情。 所以我聽窗口「加載」事件。

但是,如果腳本加載後的window.load事件...我怎麼知道window.load已被解僱?

當然,我不希望任何其他腳本添加的東西(它們都裝異步,問題是一樣的):)

編輯:

想象一下,沒有一個HTML文檔它的Javascript在所有。

比某人在此文檔中插入標籤,並且此腳本標記加載了我的Javascript文件。

這將執行我的腳本。

該腳本如何知道window.load是否已經被觸發?

沒有jQuery,在我的HTML文檔中沒有任何腳本。

是否有可能知道?

我找到了window.document.readystate屬性。此屬性用於文檔「就緒」事件I gess,而不是窗口「加載」。 有沒有類似的窗口「加載」事件?

+0

爲什麼不使用jQuery文檔準備事件?否則,hook window.load事件並設置一個標誌(例如'window.loadFired'),並且隊列超時以每50ms檢查一次該標誌。 –

+0

你可以在不是異步加載的窗口加載事件中設置一個全局布爾值嗎? – Aeoril

+0

我想等待窗口「加載」事件,因爲在此事件之前,瀏覽器仍然很忙。當瀏覽器真的準備就緒時,我想開始工作....也許這很愚蠢,但無論如何,這是一個問題,不能知道事件是否被解僱了......不是嗎? – Nicolas

回答

-3

重寫window.load怎麼樣?

window._load = window.load; 
window.load = function(){ 
    window.loaded = true; 
    window._load(); 
} 

然後檢查

if (window.loaded != undefined && window.loaded == true){ 
    //do stuff 
} 
+2

這不會做這項工作。如果窗口的「加載事件已經被觸發,覆蓋window.load就沒用了,它已經被執行了,它就不會再有了...... – Nicolas

1

如果你不想使用jQuery,它使用的邏輯是:

if(!document.body) 
    setTimeout(checkAgain, 1); 

所以窗口之間加載事件,如果檢查文檔的主體屬性是可用的,你可以檢查DOM是否準備好了

+2

當DOM準備就緒時,document.body可用。當窗口」load「被觸發時這個解決方案用於檢測文檔「準備就緒」(準備就緒),但我會優先猜測窗口「加載」事件... – Nicolas

2

這是我的回答:

fiddle

window.addEventListener("load", function() { 
    window.loaded = true; 
}); 

function logLoaded() { 
    console.log("loaded"); 
} 

(function listen() { 
    if (window.loaded) { 
     logLoaded(); 
    } else { 
     console.log("notLoaded"); 
     window.setTimeout(listen, 50); 
    } 
})(); 

你可以閱讀有關的addEventListener()和它的兼容性(這是新來的的ECMAScript 5規格)here。這是繼續前進的新「首選」方式。

您可以閱讀有關立即調用函數表達式(IIFE)(或者,自調用匿名函數或立即調用匿名函數)here

編輯:這已經是一個很好的答案在計算器上:

How to check if DOM is ready without a framework?

如果你特別想知道,如果DOM load事件觸發,坐落在一個DOM「負荷」的全局變量事件處理程序然後在加載新代碼時檢查它的存在。

// in 'load' event handler 
window.domLoadEventFired = true; 

// in code you are loading asynchronously 
if (typeof window.domLoadEventFired !== undefined) { 
    // ... 
} 
+1

要使此解決方案起作用,我們必須在窗口「加載」事件之前執行一些代碼。即使它很小,這個腳本也必須同步加載(或者直接寫在HTML文檔中),否則你不能確定它是在窗口「加載」前執行的....我錯了嗎? – Nicolas

+0

你是對的。如果你可以處理!document.body的東西,那可能不需要它,但是我不太確定那與加載事件的觸發有什麼關係 – Aeoril

+0

我可以問一下嗎?什麼需要是沒有同步代碼?@Nicolas – Aeoril

相關問題