博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
测试DOM0级事件和DOM2级事件的堆叠
阅读量:6913 次
发布时间:2019-06-27

本文共 1540 字,大约阅读时间需要 5 分钟。

1. 问题

如果大家看过北风网CJ讲师的Javascript视频教程,就可以看到其封装了一个很强的事件添加和删除函数,如下所示

1  function addEvent(obj, evtype, fn) { 2     //符合W3C的事件模型 3     if (obj.addEventListener) { 4         obj.addEventListener(evtype,fn,false); 5         return obj; 6     } 7          8     //IE或Opera浏览器 9     if (!obj.functions) obj.functions={};10     if (!obj.functions[evtype])11         obj.functions[evtype] = [];12         13     var functions=obj.functions[evtype];14     for (var i=0;i

它因为各种原因,没有采用IE的DOM2级事件添加函数attachEvent,以期达到非常完美的兼容性,据说可以到 IE5.5 或以下。分析代码页可以看到,它通过给DOM元素添加一个以 on + ‘type’ 为名的属性,其对应的值是一个处理函数的数组,本质来说就是仅仅利用 DOM0级提供的接口 elem.onclick = function () { ...} 来添加事件。

一直以来没有发现什么问题,直到给别人使用时,发现IE6~8通过该封装函数 addEvent 添加的 load 事件并没有执行,调试代码发现别人在 JS 中通过 window.onload 赋了一个处理函数,顿时明白这种 addEvent 封装的一个大Bug,原因很简单,通过DOM0级提供的事件接口多次添加时,后面的函数会覆盖前面的,而这种 addEvent 本质上就是一个 DOM0级函数,所以肯定会被后面的覆盖。

也就是说, addEvent 是假定网页JS代码中不使用 DOM0级添加事件。

 

2. 构建测试页面和代码

1  2  3  4     
5 6 测试DOM0级事件和DOM2级事件的堆叠 7 8 9 10 11 12 13 43 44

测试1:点击测试按钮,可以看到textarea 中只是输出 DOM 0 Level Click 22222 信息,也就是后面添加的事件覆盖了之前添加的,跟变量赋值是一个道理!!

测试2:将 DOM2 级事件添加的代码反注释掉,打开网页点击测试按钮,可以看到会输出 DOM 2 Level Click 和 DOM 0 Level Click 22222,也就是说DOM0 级事件和 DOM2 级添加的事件都会处理,DOM0级并不会覆盖 DOM2 添加的事件处理函数。

测试3: 将 DOM2 级事件保持注释状态,反注释掉 addEvent 部分, 可以看到只会输出 DOM 0 Level Click 22222。

测试4: 在测试3 的基础上, 注释掉后面两个 DOM0 级添加事件的代码,以测试 addEvent 的输出,可以看到它输出 DOM 2 Level Click, 从而证明测试3中其被覆盖的结论。

 

3. 总结

  1) DOM0 级事件和 DOM2 级事件可以共存;

  2) 尽量不要写 DOM0 级事件,特别是代码提供给别人使用时,绝对不能写!

转载于:https://www.cnblogs.com/zhenyu-whu/p/3276763.html

你可能感兴趣的文章
这些方法助你优化 Android 启动速度
查看>>
《简明电路分析》——2.4节单口网络
查看>>
《动手玩转Arduino》——10.4 作品36:做一个三区域触摸开关
查看>>
《位置大数据隐私管理》—— 导读
查看>>
如何在 Ubuntu 以及 Debian 中安装 DHCP 服务器
查看>>
《图数据库》——2.1 关系型数据库缺少联系
查看>>
16万Facebook数据告诉你,单身狗更爱养猫
查看>>
《JUnit实战(第2版)》—— 1.6 使用JUnit测试
查看>>
C++程序设计:原理与实践(进阶篇)17.6 Shape
查看>>
《JavaScript设计模式》——1.3 用对象收编变量
查看>>
《HTML5+CSS3网页设计入门必读》——1.6 再次联手
查看>>
永远不要在Linux执行的10个最危险的命令
查看>>
Discretized Streams, 离散化的流数据处理
查看>>
《嵌入式Linux基础教程(第2版)》——1.2 嵌入式Linux现状
查看>>
科普丨【计算机视觉】OpenCV中直方图处理函数简述
查看>>
《量化金融R语言初级教程》一2.3 使用真实数据
查看>>
《C++编程惯用法——高级程序员常用方法和技巧》——1.4 使用CRC卡片来辅助设计...
查看>>
《Adobe Flash CS6中文版经典教程》——1.10 修改内容和舞台
查看>>
《Python高手之路》——2.7 Christophe de Vienne访谈
查看>>
《iOS 6高级开发手册(第4版)》——1.10节秘诀:Core Motion基础
查看>>