2015-06-30 18 views
2

下面的代碼片段是從書JavaScript:明確指南從「JavaScript:The Definite Guide」使用這個onLoad函數有什麼意義?

我對此有一些疑問。從我的角度來看,我不會預見任何必須使用onLoad函數的情況。

我認爲這段代碼必須作爲全局JavaScript來使用,而不是作爲事件處理程序的一部分。如果在按鈕的事件處理程序中調用它,則窗口上的加載事件必須已經被觸發。結果,註冊的函數將永遠不會被調用。

但是,如果它被用作全局JavaScript,則在調用onLoad函數時,onLoad.loaded總是爲false。

爲什麼不只是在窗口上註冊加載事件,而不是檢查onLoad.loaded是真是假?

// Register the function f to run when the document finishes loading. 
 
// If the document has already loaded, run it asynchronously ASAP. 
 
function onLoad(f) { 
 
    if (onLoad.loaded) // If document is already loaded 
 
     window.setTimeout(f, 0); // Queue f to be run as soon as possible 
 
    else if (window.addEventListener) // Standard event registration method 
 
     window.addEventListener("load", f, false); 
 
    else if (window.attachEvent) // IE8 and earlier use this instead 
 
     window.attachEvent("onload", f); 
 
} 
 

 
// Start by setting a flag that indicates that the document is not loaded yet. 
 
onLoad.loaded = false; 
 

 
// And register a function to set the flag when the document does load. 
 
onLoad(function() { 
 
    onLoad.loaded = true; 
 
});

+0

「* onLoad.loaded永遠是假的*」 - 你爲什麼這麼認爲?它在代碼段中顯式設置爲「true」。 – Bergi

+0

當您的應用程序依賴於它們的腳本有很多時,您需要確保它們在您開始運行應用程序之前加載。 – Atrotors

+0

如果您不知道用戶將在何處或如何包含該插件,這對插件可能很有用。如果用戶在頁面加載後動態地包含插件,則分配一個「Document.onLoad」事件處理程序將不會執行任何操作,因爲該頁面已經加載。所以基本上這只是增加了一個抽象層,以允許一個插件無論在哪裏加載都能正確運行 –

回答

1

我想你誤會了使用場景。

你說得對,應該在啓動時執行上面的代碼片段,在網頁完成加載之前,以便onLoad.loaded被準確分配。

然而,這是由腳本定義的onLoad功能,可以從任何地方,以後調用,甚至從按鈕事件處理等

+0

如果稍後從按鈕事件處理程序調用onLoad函數,則由於加載事件,onLoad.loaded必須已設置爲true。然後,它總是執行的分支window.setTimeout(f,0)。如果是這種情況,則不需要使用onLoad函數-------只是使用window.setTimeout(f,0)或者僅僅使用f()。 –

+0

@鄭全白:是的,那是國旗的目的。但也有一些事件你不知道'load'是否已被觸發(例如異步加載腳本,或者在編寫可能在啓動過程中或在按鈕點擊時調用的函數) – Bergi

+0

OK。謝謝! ........................... –

相關問題