IE下,事件触发那点破烂事儿
作者:lifesinger 来源:岁月如歌 发布时间:2009-04-27 12:31:00
* 惯,请先看测试页面:event-test.html
结论:
在非IE浏览器,同一元素同一事件类型的处理函数是先进先出的。只有IE下,是先进后出。
jQuery实现了自己的一套队列机制,用jQuery注册的事件,在IE下也是先进先出的。
可以用setTimeout脱离当前队列,排到后面去。在一定程度上,这可以解决某些问题。
在jQuery中,可以用stopImmediatePropagation方法阻止队列中的后续事件。
看起来,jQuery的处理很强大很人性化。但是,一个好的鲁棒的事件机制,我觉得应该满足以下三个特性:
独立性:在注册事件时,各个事件处理函数彼此绝缘,不知道对方的存在。
并发性:在触发事件时,各个事件处理函数是并发的,不存在顺序依赖关系。
健壮性:在触发事件后,某个事件处理函数的异常,不会影响其它事件处理函数,不会因一粒老鼠屎而坏掉一锅汤。
独立性要求我们在设计时就考虑清楚。比如以下应用场景,给链接linkA先后注册事件eventA和eventB. 在eventA里,动态生成divA. 在eventB里,需要对divA进行操作。这种设计,就让eventA和eventB产生了关联。在IE下,eventB先触发,结果就会和预期不对。一个更好的做法是,将对divA的操作,放到eventA里去,保证eventB不依赖eventA。当然,实际情况比我们想象中的复杂,比如eventA可能是第三方代码,我们无权修改。这时,采用事件代理,将eventB注册到linkA的父级容器里去,能保证eventB在eventA之后执行。但这依旧取决于第三方代码的写法,比如在第三方代码里可能停止了事件冒泡。对于事件的依赖,没有完美的解决方案。最好的做法就是,从一开始就尽量让各个事件处理函数保持独立性。
因为JavaScript的单线程特性,并发目前是做不到的。作为一个良好的思维习惯,我们可以认为JavaScript的事件触发是并发的。这样,不独立都不行。独立性的重要性也就不言而喻了。注:setTimeout可以让当前函数在线程中重新排队,但某种程度上属于hack,不可滥用。
在YUI和MooTools中,当一个事件处理函数异常时,不会影响其它事件处理函数(实现方式很简单,就是try catch)。但在jQuery 1.3.2中,如果一个事件处理处理函数异常,剩下的函数都不会执行了。健壮性能让独立性真正发挥作用,也是并发性的保障。在框架级代码中得特别留意。
结论的结论
保持独立性很重要。无论做人,还是写代码。


猜你喜欢
- 阅读上一篇:[译]Javascript风格要素(一) 我们使用习惯用法可以使我们的意图更加的清晰和简洁。使用==时,当心强制转换考虑下面函数
- 本文实例讲述了sql server实现在多个数据库间快速查询某个表信息的方法。分享给大家供大家参考,具体如下:最近出来实习,所在公司的服务器
- 本文主要介绍如何用Python设计一个经典小游戏:猜大小。在这个游戏中,将用到前面我介绍过的所有内容:变量的使用、参数传递、函数设计、条件控
- 阿里云服务器的带宽为2M,网站每日的备份包都3G多了,离线下载太费时间了,打算每日将备份包自动上传到自己的百度云盘里。 1、先安装
- Python在用GPU跑模型的时候最好开多进程,因为很明显这种任务就是计算密集型的。用进程池好管理,但是tensorflow默认情况会最大占
- 一、前言一首歌热门了,参与评论的人也很多,那我们有时候想看看评论,也只能看看热门的评论,大部分人都说的什么,咱也不知道呀~那本次咱们就把歌词
- MySQL语句优化的基本原则:◆1、使用索引来更快地遍历表。缺省情况下建立的索引是非群集索引,但有时它并不是最佳的。在非群集索引下,数据在物
- 在并发编程中,我们需要处理多个线程同时对共享资源的访问问题。如果不加控制地同时访问共享资源,就会导致竞争条件(Race Condition)
- 主要讲 except 和 not in 的性能上的区别。 CREATE TABLE tb1(ID int) CREATE TABLE tb2
- 如何让用户也能修改密码? 好了,照下面添加到你要添加的地方去:<%id = Request(&qu
- 前言:线程是指进程内的一个执行单元,也是进程内的可调度实体.与进程的区别:(1) 地址空间:进程内的一个执行单元;进程至少有一个线程;它们共
- SQL2005没有像SQL2000一样的客户端网络实用工具,基本上SQL2005算是把SQL2000里面的名字都改了,在网上找资料也没找到,
- 一,通用的ASCII码对照表 图解ASCII码对照表图,以字符A为例Dec表示十进制,如65Hx表示十六进制,如41Oct表示八进制,如10
- 虽然 prometheus 已有大量可直接使用的 exporter 可供使用,以满足收集不同的监控指标的需要。例如,node exporte
- 本文实例讲述了Python实现的查询mysql数据库并通过邮件发送信息功能。分享给大家供大家参考,具体如下:这里使用Python查询mysq
- 前言本文题目中虽然写有vue和react,但是并非vue和react相关知识,而是最基本的html5和css3的一些知识,之所以写vue,是
- 今天帮一同学导入一个excel数据,我把excel保存为txt格式,然后建表导入,失败!分隔符格式不匹配,无法导入!!!!怎么看两边都是\t
- 一个重要的应用就是如何在遗忘root用户密码的时候修改密码,使用的方法是启动MySQL服务器时忽略加载授权表。由MySQL使用用户名和口令的
- 一、相关知识点1.1、SeleniumSelenium是一个强大的开源Web功能测试工具系列,可进行读入测试套件、执行测试和记录测试结果,模
- asp获取application对象代码如下: <%application("new&qu