2017-10-13 51 views
0

請看下面的代碼。IE中觸發的事件異步發生

var $myInput = $('#myInput'); //select the <input> element 

$myInput.on('focus', function(){ 
    console.log('Input focused'); 
}) 

現在如果我執行IE中的以下兩行:

$myInput.trigger('focus'); 
console.log('Done'); 

..輸出將是:

Done 
Input Focused 

這是因爲,在IE中,觸發事件執行異步。但這是所有其他瀏覽器的其他方式。是否有任何解決方法比使用triggerHandle()或手動調用事件處理函數?

+0

你的意思是這個訂單在其他瀏覽器中也不能保證? –

+1

[如何訂購與jQuery綁定的事件]可能的重複(https://stackoverflow.com/questions/290254/how-to-order-events-bound-with-jquery) – Liam

回答

0

雖然JS可以看作是腳本的單線程,但瀏覽器體系結構的處理方式有所不同。例如,在某些系統中,window.onresize代碼可以在中間執行腳本時觸發。

Here is是一個答案,爲此提供了一些見解。因此,當你觸發一個事件時,瀏覽器將它放入並行運行的事件隊列中(引用的答案有一些證據)。

然後會發生什麼事是:

  1. IE是如此之慢當前代碼段與完成後的事件循環被執行。

  2. 其他瀏覽器足夠快,即使在循環立即執行。

但是,所有這些暗示,當您通過代碼觸發事件時,沒有確定的方式可以斷定哪部分代碼將會主持另一部分代碼。

2

不可以。沒有辦法可靠地保證訂單。解決方法是不要僞造事件。將在focus事件中執行的邏輯放在它自己的函數中,然後直接調用它。

var $myInput = $('#myInput');  
$myInput.on('focus', function() { 
    foo(); 
})  

foo(); 
console.log('Done'); 

function foo() { 
    console.log('foo'); 
} 
+0

您的意思是,訂單不能保證其他瀏覽器呢? –

+2

這是正確的。這並不能保證,但是他們的JS實現速度足夠快,以至於你通常可以擺脫它。 IE不是。 –

+0

是的,訂單不能保證。你可以在後面的問題中看到這個:https://stackoverflow.com/questions/46707989/how-trigger-element-event-synchronously-in-ie/46708210#46708210 –