2016-12-16 60 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队列。 –

相关问题