2016-12-16 50 views
0

window.onload多次撥打真的發生了什麼? IE在FIFO或鏈中是否存在多個window.onload事件?

function onLoadHandler(mMethod){ 
    var previous = window.onload; 
    window.onload = function() { 

     if(previous) previous(); 

     mMethod(); 
    } 
} 

如果我使用window.onload = function() { /* print to console */ };我打電話之前我onLoadHandler()五(5)每次調用打印到控制檯告訴我該叫這個。它按順序打印到控制檯。即使我寫了第二個onLoadHandler2()並再打5次。所有東西都按正確順序打印,即按照呼叫順序打印,包括首先調用的window.onload事件。

我無法弄清楚這裏發生了什麼。它是一個FIFO堆棧?每個電話是否被放入一個堆棧,並且第一個電話是首先輸出,因此按照正確的順序打印到控制檯?

+0

它將具有FIFO的行爲。基本上,代碼在覆蓋它之前採取了以前的任何操作,先調用它,然後調用傳入的方法。你可以任意重複該模式。 'window.onload'只能有一個值,這就是爲什麼這個東西是必需的。 –

+1

「需要?」那麼'window.addEventListener'呢? – qxz

+1

「window.onload的多次調用真的發生了什麼」 - 這是沒有意義的,因爲'onload'只被調用一次:通過瀏覽器。我想你可以自己手動調用它。 – Dai

回答

0

window.onload的多次調用真的發生了什麼?

你正在使這個比現在更復雜。 window.onload只被瀏覽器調用一次。如果window.onload解析爲一個函數,那麼該函數將被調用。沒有什麼特別的。

如果分配給window.onload的函數調用其他函數,那麼這些函數也會被調用(當然)。

你在你的代碼中做什麼,你是「保留」以前的值window.onload並明確地調用它(previous())如果它存在。如果你沒有這樣做,那麼只會調用mMethod(),不管前面的值window.onload是什麼。

+0

我想你是在說如果我打電話給我的功能十次,最新的電話會保留這些私人電話。有點像'next'的呼叫被添加到呼叫列表的末尾。 A.B.C.D下一個電話,我們將使用E,因此A.B.C.D.E E在它自己之前保留祕密電話。這意味着A先運行然後B運行,等等。我對你有正確的理解嗎? – Wyght

+0

基本上是的。如果你在*'mMethod();之後移動了'if(previous)previous();'*,那麼順序就是相反的。所以實際上你實現了這個FIFO隊列。 –

相關問題