2014-11-03 86 views
2

今天我偶然发现了一个奇怪的Internet Explorer怪癖。我调用元素的焦点函数,然后绑定事件侦听器。在所有浏览器中,它都按时间顺序执行,但在IE中却没有。addEventListener触发焦点之前的Internet Explorer焦点?

我有这样一段代码:

var t = document.getElementById('focusable'); 
 
t.focus(); 
 
t.addEventListener('focus', function() { 
 
    alert('This should only happen after the second focus.'); 
 
});
<input id="focusable">

我的问题是:
为什么会出现这种情况?,我怎样才能解决它没有setTimeout(fn,0);黑客。

注:我使用IE11

回答

2

为什么会出现这种情况?

大概是因为在JavaScript线程退回到浏览器之前,IE实际上并没有给出元素焦点。

如何在没有setTimeout(fn,0)的情况下解决这个问题;黑客攻击。

使用setTimeout在这种情况下似乎是正确的事情,而不是黑客。但是,如果它不起作用。 :-)

我讨厌这样说,但它听起来像是你可能需要一个标志,并有意确保第一焦点触发您的处理程序:

(function() { 
 
    var flag = false; 
 
    var t = document.getElementById('focusable'); 
 
    t.blur(); 
 
    t.addEventListener('focus', function() { 
 
    if (!flag) { 
 
     flag = true; 
 
    } else { 
 
     snippet.log('This should only happen after the second focus.'); 
 
    } 
 
    }, false); 
 
    t.focus(); 
 
})();
<!-- Temporary snippet object, see http://meta.stackexchange.com/a/242144/134069 --> 
 
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script> 
 
<input id="focusable">

+0

谢谢您的答复。我只是测试了setTimeout“解决方案”的一致性,但偶尔会失败。我把setEventListener放在settimeout里面。 – A1rPun 2014-11-03 09:06:17

+0

谢谢T.J.我也讨厌它,但至少这是一致的;) – A1rPun 2014-11-03 09:20:22

+0

@ A1rPun:不用担心。公平的警告:上述工作适用于IE11和Chrome,但Firefox拒绝给予重点关注。它执行't.focus();'行,但没有给出字段焦点 - 即使我只将该位放在'setTimeout'中。 V.怪异的,我知道我已经把焦点集中在Firefox的领域之前...... – 2014-11-03 09:22:31