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中,如果一个事件处理处理函数异常,剩下的函数都不会执行了。健壮性能让独立性真正发挥作用,也是并发性的保障。在框架级代码中得特别留意。
结论的结论
保持独立性很重要。无论做人,还是写代码。
猜你喜欢
- 如何制作一个倒计时的程序? 见下:<%CountdownDate = #1/1
- 经过摸索和实践,我把自己的解决方法,写在下面: 说明: 我的Oracle客户端的版本是 oracle 9i, 安装client端的时候,不能
- JS在firefox中的兼容性问题,自己也经常遇到.此文是网上资料,不过时间较久不记得原址了...1. document.form.item
- 我们在使用ASP 内置的ADO组件进行数据库编程时,通常是在脚本的开头打开一个连接,并在脚本的最后关闭它,但是就较大脚本而言,在多数情况下连
- 前几天有个人退群了。起因很简单,他问了一个问题,没人回答,于是说要退群,后来我看到了,给了个链接,说这个问题已经说过好多遍了,于是他就退了。
- 复制代码 代码如下: public partial class CMS_DBDataContext { partial void OnCre
- 这篇论坛文章(赛迪网技术社区)主要介绍了配置一个高可用性的MySQL服务器负载均衡群集的具体过程,详细内容请参考下文:本文将告诉你如何配置一
- 之前用Crystal做了一个数字转English Word的Formula刚刚心血来潮, 大半个晚上写了JS版本的数字转换, 由于JS的Bu
- 在web开发中常常要使用js,为了提高效率一般都会制作js的类文件。这样在使用中更新复用都很方便。下面按照我工作中的一个案例,介绍如何定义j
- delete 删除一张大表时空间不释放,非常慢是因为占用大量的系统资源,支持回退操作,空间还被这张表占用着。truncate table 表
- 首先,与其他语言不同,JS的效率很大程度是取决于JS engine的效率。除了引擎实现的优劣外,引擎自己也会为一些特殊的代码模式采取一些优化
- 靓丽的网页是怎样生成的?也许您会脱口而出,当然是自己设计出来的。没错!不过这其中也有网页制作工具的一部分功劳,因为功能强大的网页制作工具可以
- 之前有看过一个博文写的是白社会的设计很好但运营却有些遭,因为对每一个WebGame的推出时间把握不准,会有几个应用同时上线造成影响力的冲突,
- 用SQL语句添加删除修改字段 1.增加字段 alter table docdsp add dspcode char(200) 2.删除字段
- 代码如下: Function closeHTML(strContent) Dim arrTags, i, OpenPos, ClosePos
- 近来有客户要求用table显示一大串数据,由于滚动后就看不到表头,很不方便,所以想到这个效果。上次做table排序对table有了一些了解,
- 可以查看mysql文件目录my.ini文件,可以找到类似于 datadir="D:/beeagle/Program Files/M
- 主要利用了XMLHTTP的一些方法和属性来获取服务器的信息。 以下是全部源代码: &
- 阅读上一篇:Freshow工具使用方法一. eval加密是在网马解密中最常见的,eval在jscript脚本中实际上是一个函数,简单可以理解
- 使用MySQL,安全问题不能不注意。以下是MySQL提示的23个注意事项:1.如果客户端和服务器端的连接需要跨越并通过不可信任的网络,那么就