2017-10-13 50 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 –