在IE中触发的事件是异步发生的

时间:2017-10-13 08:27:23

标签: javascript jquery internet-explorer events asynchronous

请查看以下代码。

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()或手动调用事件处理函数?

2 个答案:

答案 0 :(得分:2)

没有。没有办法可靠地保证订单。解决方法是不假冒事件。将在focus事件中执行的逻辑放在自己的函数中,然后直接调用它。

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

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

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

答案 1 :(得分:0)

虽然JS可以被视为脚本的单线程,但浏览器架构以不同的方式处理事物。一个例子是,在某些系统中,window.onresize代码可以在您执行脚本的过程中触发。

Here is是一个答案,可以为此提供一些见解。

因此,当您触发事件时,浏览器会将其放入并行运行的事件队列中(?引用的答案有一些证明)。

接下来会发生什么:

  1. IE速度很慢,以至于在完成当前代码段后执行事件循环。

  2. 其他浏览器足够快,可以立即执行循环中的偶数。

  3. 然而,所有这些都暗示当你通过代码触发事件时,没有保证可以断定代码的哪一部分将主持另一部分。