2010-01-12 37 views
12

我有一段JavaScript代碼。而且我不太瞭解它。 你可以一行一行地對我進行擴展嗎?非常感謝。關於window.onload在javascript中的困惑

function addLoadEvent(func) { 
    var oldonload = window.onload; 
    if (typeof window.onload != 'function') { 
    window.onload = func; 
    } else { 
    window.onload = function() { 
     oldonload(); 
     func(); 
    } 
    } 
} 

這裏是我在想什麼:

function addLoadEvent(func) { //define a function with a parameter 'func' 
    var oldonload = window.onload; //assign window.onload event to variable oldonload 
    if (typeof window.onload != 'function') { //if window.onload is not a function, then... 
    window.onload = func; //assign 'func' to window.onload event. what does func mean? 
    } else {    //if window.onlad is a function 
    window.onload = function() { //don't understand 
     oldonload(); //call function oldonload() 
     func();  //call function func() 
    } 
    } 
} 

困惑:

的window.onload已經是一個事件,爲什麼我們使用的typeof?

function addLoadEvent(func),window.onload = func,func()。這些funcs有什麼區別?

我很抱歉張貼新手問題。但是,感謝任何給我一些指導的人?

編輯:

這是由Simon Willison改進的原始代碼。

function addLoadEvent(func) { 
    var oldonload = window.onload; 
    if (typeof window.onload != 'function') { 
    window.onload = func; 
    } else { 
    window.onload = function() { 
     if (oldonload) { 
     oldonload(); 
     } 
     func(); 
    } 
    } 
} 
+1

這是一個老版本的一些代碼最初是由西蒙·威利森在2004年寫的:http://simonwillison.net/2004/May/26/addLoadEvent/注西蒙在2006年更新了代碼,以解決IE7上的潛在問題 - 您可能想要納入他的更新。 – NickFitz 2010-01-12 15:31:01

+0

感謝您的信息NickFitz。我已經檢查過它。 – 2010-01-12 15:38:38

+0

謝謝大家的回覆和解答。 :) – 2010-01-12 15:43:43

回答

17

它很簡單。

您檢查是否已經註冊了onload函數。

如果心不是一個, 1.分配「功能」你傳遞給onload事件

如果有的話, 創建一個新的onload函數的功能,這將:

  1. 通話舊的onload功能
  2. 打電話給你的 '功能',你在

,並通過:

window.onload已經是一個事件,而 爲什麼我們要用typeof?

window.onload可以是一個函數,但如果沒有設置,它將是'未定義',我們需要檢查它的類型以查看它是什麼。

function addLoadEvent(func), window.onload = func,func()。 這些funcs的區別是什麼?

函數是javascript中的變量。所以你可以參考功能

FUNC

,你可以把它作爲

FUNC()

你的情況:功能addLoadEvent(FUNC)是當前函數確定指標。它需要一個參數,並且該參數應該是一個功能

窗口。的onload = FUNC 您分配傳遞到onload事件

FUNC()

叫你

這裏傳遞函數的功能是逐行修正:

function addLoadEvent(func) { //define a new function called addLoadEvent which takes in one param which should be function 
    var oldonload = window.onload; //assign window.onload event to variable oldonload 
    if (typeof window.onload != 'function') { //if window.onload is not a function, and thus has never been defined before elsewhere 
    window.onload = func; //assign 'func' to window.onload event. set the function you passed in as the onload function 
    } else {    //if window.onlad is a function - thus already defined, we dont want to overwrite it so we will.. 
    window.onload = function() { //define a new onload function that does the following: 
     oldonload(); //do whatever the old onload function did 
     func();  //and then do whatever your new passed in function does 
    } 
    } 
} 

//then call it like this: 
addLoadEvent(function() { 
    alert("hi there"); 
}); 
addLoadEvent(function() { 
    alert("this will be alerted after hi there"); 
}); 
//or like this: 
var fn = function(){ 
alert("this will be the last thing alerted"); 
}; 
addLoadEvent(fn); 
+0

你能糾正我在代碼中的行嗎?我不擅長JavaScript。 – 2010-01-12 15:14:16

+0

完成,查看最近編輯 – mkoryak 2010-01-12 15:21:58

+0

@非常感謝mkoryak。我只想確保第2行的「window.onload」。「window.onload」有什麼可能性?因爲大衛多沃德說:「這不是一個事件,它是一個屬性,可能是一個函數或未定義的」。你怎麼看? – 2010-01-12 15:33:15

4

你可以爲我逐行放大它嗎?

我懶得,但簡而言之就是:

  • 複製的onload另一個變量
  • 如果爲onload如果一個功能,將其設置爲運行傳遞函數,則新功能老功能
  • 如果不是,只是使傳遞函數運行的onload

window.on load = func; //將'func'賦給window.onload事件。 func是什麼意思?

func是定義爲該函數的第一個參數(函數addLoadEvent(func))的變量。函數是JavaScript中的第一類對象 - 您可以像其他變量一樣傳遞它們。

window.onload已經是一個事件,爲什麼我們使用typeof?

這不是一個事件。它是一個可能是函數或未定義的屬性。該事件是「發生的事情」,導致該功能被運行。

function addLoadEvent(func),window.onload = func,func()。這些funcs有什麼區別?

第一個定義了一個名爲addLoadEvent的函數。第二個分配一個名爲func的函數來加載。第三個調用名爲func的函數。

另外,不要使用它。使用addEventListener/attachEvent或使用跨瀏覽器對其進行標準化的庫,如YUIjQuery

+0

@David Dorward,非常感謝您的逐行修正。你真好。 :) – 2010-01-12 15:50:28

1

定義的功能addLoadEvent(func)旨在爲已有的window.onLoad事件添加附加功能。因此,它所做的第一件事是檢查window.onLoad事件是否爲而不是函數。如果不是,它只是將傳入的函數分配給window.onLoad事件。

但是,如果已經定義了window.onload,它會重置它以調用原始的onload函數以及您傳入的函數(func)。

你會使用它,像這樣以自己的事件添加到「堆棧」:

addLoadEvent(function() { 
    alert('Hello! I run after the original window.onload event if it exists!'); 
}); 

這傳遞一個匿名函數的addLoadEvent功能。這就是上述代碼中的window.onload = function() { ... }中發生的情況。您也可以事先定義函數並將其傳入,如下所示:

var myOnloadEvent = function() { 
    alert('Hello! I run after the original window.onload event if it exists!'); 
}; 

addLoadEvent(myOnloadEvent); 
+1

謝謝Topher Fangio。 :) – 2010-01-12 15:51:06

+0

@ garcon1986 - 不客氣!感謝您花時間說謝謝:-) – 2010-01-12 16:11:32

1

在JavaScript中,「函數」是變量可以採用的基本變量類型。 Javascript也是鬆散的類型,所以變量的值取決於分配給它的最後一件事。 「event」只是窗口對象的成員變量。因此,您可以將其分配給任何你喜歡的。如果從未分配過任何東西,它將在javascipt中使用「未定義」的原始值。因此,對於檢查:

if (typeof window.onload != 'function') { 

是真的檢查,看看是否window.onload事件處理程序尚未或沒有定義。

如果還沒有定義,那麼這個函數就是給window.onload事件處理函數賦值func(即在窗口加載時會調用func)。

如果它已被定義,那麼這個函數將創建一個新的函數,當窗口加載時調用現有的onload處理程序,然後調用func。這個例子還使用了一個名爲'closure'的JavaScript屬性/語言特性,以便新定義的'compose'函數可以訪問超出其範圍的變量,這些變量在外部函數失去範圍之後仍然存在。

也許更有意義的檢查將是:

if (typeof window.onload === 'undefined') { 
+0

@thanks vicatcu。 typeof返回值是「數字」,「字符串」,「布爾」,「對象」,「功能」和「未定義」。所以,window.onload只有兩個可能是「功能」和「未定義」。我對嗎? – 2010-01-12 15:55:55

+0

從技術上講,它可以承擔*你提到的任何*值,但是除「undefined」和「function」以外的任何其他值都可能是編程錯誤非常愚蠢的結果:)。 – vicatcu 2010-01-12 16:10:25

+0

好吧,我明白了。感謝vicatcu。 – 2010-01-12 16:20:08