IE下,事件触发那点破烂事儿

作者:lifesinger 来源:岁月如歌 时间:2009-04-27 12:31:00 

* 惯,请先看测试页面:event-test.html

结论:

  1. 在非IE浏览器,同一元素同一事件类型的处理函数是先进先出的。只有IE下,是先进后出。

  2. jQuery实现了自己的一套队列机制,用jQuery注册的事件,在IE下也是先进先出的。

  3. 可以用setTimeout脱离当前队列,排到后面去。在一定程度上,这可以解决某些问题。

  4. 在jQuery中,可以用stopImmediatePropagation方法阻止队列中的后续事件。

看起来,jQuery的处理很强大很人性化。但是,一个好的鲁棒的事件机制,我觉得应该满足以下三个特性:

  1. 独立性:在注册事件时,各个事件处理函数彼此绝缘,不知道对方的存在。

  2. 并发性:在触发事件时,各个事件处理函数是并发的,不存在顺序依赖关系。

  3. 健壮性:在触发事件后,某个事件处理函数的异常,不会影响其它事件处理函数,不会因一粒老鼠屎而坏掉一锅汤。

独立性要求我们在设计时就考虑清楚。比如以下应用场景,给链接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中,如果一个事件处理处理函数异常,剩下的函数都不会执行了。健壮性能让独立性真正发挥作用,也是并发性的保障。在框架级代码中得特别留意。

结论的结论

保持独立性很重要。无论做人,还是写代码。

Mootools 1.2教程

标签:ie,事件,浏览器,jQuery
0
投稿

猜你喜欢

  • 浅谈Pytorch中autograd的若干(踩坑)总结

    2022-11-01 01:11:06
  • Python打印不合法的文件名

    2021-06-29 03:40:19
  • Golang利用casbin实现权限验证详解

    2023-08-06 23:18:45
  • Python 实现Serial 与STM32J进行串口通讯

    2021-03-05 16:01:33
  • flask框架url与重定向操作实例详解

    2022-02-08 17:49:39
  • 十个Python程序员易犯的错误

    2023-11-27 03:43:13
  • 详解python字节码

    2021-12-16 16:56:29
  • python 用所有标点符号分隔句子的示例

    2022-09-18 01:41:57
  • PyTorch 解决Dataset和Dataloader遇到的问题

    2023-10-14 04:37:50
  • centos下mysql主从复制设置详解

    2024-01-20 23:27:06
  • python实现12306抢票及自动邮件发送提醒付款功能

    2021-03-12 19:01:46
  • Python中random模块生成随机数详解

    2023-06-13 16:11:52
  • Django获取该数据的上一条和下一条方法

    2022-12-07 13:36:35
  • Python first-order-model实现让照片动起来

    2022-04-13 10:25:48
  • koa+mongoose实现简单增删改查接口的示例代码

    2024-05-13 10:04:56
  • Go语言中的闭包详解

    2023-06-30 05:27:14
  • python使用socket创建tcp服务器和客户端

    2021-04-21 21:10:17
  • 用python标准库difflib比较两份文件的异同详解

    2023-01-29 07:34:29
  • Django如何批量创建Model

    2022-12-29 15:40:39
  • element中table操作按钮展示与折叠的实现示例

    2024-05-02 16:35:35
  • asp之家 网络编程 m.aspxhome.com