❗ 本文最后更新于 4516 天前,文中所描述的信息可能已发生改变,请谨慎使用。
以下代码,点test2后,firefox、chrome、opera输出顺序是1、2,但IE9的顺序却是2、1。
<input id="test1" /> <button id="test2">click</button> <div id="out"></div>
<script type="text/javascript">
var test1 = document.getElementById('test1'),
test2 = document.getElementById('test2'),
out = document.getElementById('out');
test1.addEventListener('focus', function(e) {
out.innerHTML += '1<br />';
});
test2.addEventListener('click', function() {
test1.focus();
out.innerHTML += '2<br />';
});
</script>
PS,如果把test1.focus()换成下面这样,则所有浏览器表现一致,都是1、2这样的顺序:
var evt = document.createEvent('Events');
evt.initEvent('focus', true, true, document.defaultView);
test1.dispatchEvent(evt);
从表面上来看,IE9中的test1.focus()这个过程被异步执行了。解决方案倒是很简单,把后面的语句放在万能的setTimeout 0里就万事大吉了。
团队的郝同学在使用QWrap的valid组件时踩到这个坑了。先记录下来,稍后做一些详细研究,有结论了再更新。
@update,团队的贾同学补充了一个链接,看来这个问题一直存在,属于历史遗留问题,不限于IE9。http://stackoverflow.com/questions/5900288/ie-focus-event-handler-delay
本文链接:https://mailseason.com/post/event-order-in-ie9.html,参与评论 »
--EOF--
发表于 2012-07-10 17:44:37,并被添加「IE、IE9、Event」标签。查看本文 Markdown 版本 »
专题「浏览器」的其他文章 »
- iOS 10 Safari 视频播放新政策 (Oct 07, 2016)
- Chrome 中 scrollingElement 的变化 (Apr 16, 2016)
- 域名小知识:Public Suffix List (Nov 28, 2015)
- window.opener.location 安全风险讨论 (Oct 09, 2015)
- 使用 SRI 增强 localStorage 代码安全 (Sep 26, 2015)
- Subresource Integrity 介绍 (Sep 23, 2015)
- 移动 Web 与 JavaScript 定时器 (Mar 27, 2014)
- Chrome 和 Web Fonts 二三事 (Mar 24, 2014)
- Webkit 异步加载 CSS 的奇怪现象 (Dec 25, 2013)
- 小成本实现部分选中的复选框 (Dec 22, 2013)
Comments
Waline 评论加载中...