JavaScript将DOM事件处理程序封装为event.js 出现的低级错误问题


Posted in Javascript onAugust 03, 2016

将 DOM 0级事件处理程序和DOM2级事件处理程序 IE事件处理程序封装为eventUtil对象,达到跨浏览器的效果。代码如下:

var eventUtil = {
// 添加事件句柄
addEventHandler:function (element,type,handler) {
if (element.addEventListener) {
element.addEventListener(type, handler,false);
}else if(element.attachEvent){
element.attachEvent("on"+type,handler);
}else {
element["on"+type]=handler;
}
},
// 删除事件句柄
removeEventHandler:function (element,type,handler) {
if (element.removeEventListener) {
element.removeEventListener(type, handler,false);
}else if(element.detachEvent){
element.detachEvent("on"+type,handler);
}else {
element["on"+type]=null;
}
},
// 获取事件对象
getEvent:function (event) {
return event?event:window.event;
},
// 获取事件的类型
getType:function (event) {
return event.type;
},
// 获取事件对象目标
getTarget:function (event) {
if (event.target) {
return event.target;
}else{
return event.srcElement;
}
},
// 阻止事件冒泡
stopPropagation:function (event) {
if (event.stopPropagation) {
event.stopPropagation();
}else{
event.cancelBubble=true;
}
},
// 阻止事件默认行为
preventDefault:function (event) {
if (event.preventDefault) {
event.preventDefault();
}else{
event.returnValue=false;
}
}
}

在练习代码的时候,自己出现了几个错误的地方,导致运行出错,记录一下,加深记忆。

① 添加句柄是混淆参数的位置:首先是addEventHandler(element,type,handler)的参数分别表示,为哪个元素element添加事件,事件的类型type,事件处理函数handler。自己容易把handler和后面addEventLister(type,handler,false)中的false(表示冒泡阶段)的位置混淆。

导致结果:在写的过程,自己认真想了一下,理解了addEventHandler需要的哪些参数,就知道哪个位置该用哪个参数,最终写对了,未导致错误。

解决办法:理解并记住。

②在IE事件处理程序判断分支中,对attachEvent和detachEvent拼写错误,少了Event,只写了attach或detach。

导致结果:虽然没有报错,但是无法使用addEventHandler和removeEventHandler在IE中添加或删除事件。

解决办法:多练记牢就行。attachEvent 和 detachEvent。

③忘记了在IE事件处理程序attachEvent 和 detachEvent的参数里事件类型是需要加"on"的;写成了attachEvent(type,handler)。其实正确的应该是attachEvent("on"+type,handler),另外忘记了还有DOM0级事件处理的判断分支

导致结果:同样的,无法兼容IE事件处理。在IE上用封装的方法添加或删除事件不能成功。

解决办法:也只能记住。还有一点需要注意:DOM0级事件中element["on"+type]这种方式。比如element["on"+"click"]等价于element.onclick。

④最后一个属性的结尾也加逗号,比如在阻止事件默认行为 preventDefault:完成后加逗号,如下面代码片段(注释)

preventDefault:function (event) {
if (event.preventDefault) {
event.preventDefault();
}else{
event.returnValue=false;
}
},//最后一个属性preventDefault完成后加了逗号,会出错
}

导致结果:在IE中运行时报错(其中event.js的54行是最后逗号的下一行,实际上就是逗号导致的;test.html的第10行则是因为调用了event.js中的eventUtil.addEventHandler方法)

解决办法:毫无疑问,去掉最后的逗号即可。

⑤还是拼写错误,IE中阻止事件冒泡的属性cancelBubble,写多了一个s,写成了cancelBubbles。

导致结果:没有报错,但是无法阻止IE中的事件冒泡。

解决办法:改回来

以上所述是小编给大家介绍的JavaScript将DOM事件处理程序封装为event.js 出现的低级错误问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
JavaScript OOP类与继承
Nov 15 Javascript
javascript实现iframe框架延时加载的方法
Oct 30 Javascript
URL的参数中有加号传值变为空格的问题(URL特殊字符)
Nov 04 Javascript
webpack常用配置项配置文件介绍
Nov 07 Javascript
javascript实现秒表计时器的制作方法
Feb 16 Javascript
详解JS中的立即执行函数
Feb 24 Javascript
vue input 输入校验字母数字组合且长度小于30的实现代码
May 16 Javascript
Vue中使用方法、计算属性或观察者的方法实例详解
Oct 31 Javascript
100行代码实现vue表单校验功能(小白自编)
Nov 19 Javascript
关于vue的列表图片选中打钩操作
Sep 09 Javascript
vue 手机物理监听键+退出提示代码
Sep 09 Javascript
Vue+Element ui 根据后台返回数据设置动态表头操作
Sep 21 Javascript
AngularJS基础 ng-srcset 指令简单示例
Aug 03 #Javascript
js删除Array数组中指定元素的两种方法
Aug 03 #Javascript
AngularJS基础 ng-src 指令简单示例
Aug 03 #Javascript
JS在Chrome浏览器中showModalDialog函数返回值为undefined的解决方法
Aug 03 #Javascript
AngularJS基础 ng-show 指令简单示例
Aug 03 #Javascript
JavaScript判断数组是否存在key的简单实例
Aug 03 #Javascript
AngularJS基础 ng-selected 指令简单示例
Aug 03 #Javascript
You might like
JQUERY简单按钮轮换选中效果实现方法
2015/05/07 Javascript
jQuery根据元素值删除数组元素的方法
2015/06/24 Javascript
基于jquery实现复选框全选,反选,全不选等功能
2015/10/16 Javascript
js实现多图左右切换功能
2016/08/04 Javascript
微信小程序开发之大转盘 仿天猫超市抽奖实例
2016/12/08 Javascript
js/jq仿window文件夹框选操作插件
2017/03/08 Javascript
解决jQuery ajax动态新增节点无法触发点击事件的问题
2017/05/24 jQuery
详解 vue.js用法和特性
2017/10/15 Javascript
详解Webpack如何引入CDN链接来优化编译后的体积
2019/06/21 Javascript
用js编写留言板
2020/03/17 Javascript
Python  __getattr__与__setattr__使用方法
2008/09/06 Python
python list使用示例 list中找连续的数字
2014/01/27 Python
python使用sorted函数对列表进行排序的方法
2015/04/04 Python
利用python打印出菱形、三角形以及矩形的方法实例
2017/08/08 Python
对python .txt文件读取及数据处理方法总结
2018/04/23 Python
python处理两种分隔符的数据集方法
2018/12/12 Python
python实现Virginia无密钥解密
2019/03/20 Python
python调用其他文件函数或类的示例
2019/07/16 Python
python多线程+代理池爬取天天基金网、股票数据过程解析
2019/08/13 Python
python双端队列原理、实现与使用方法分析
2019/11/27 Python
python、PyTorch图像读取与numpy转换实例
2020/01/13 Python
Python的3种运行方式:命令行窗口、Python解释器、IDLE的实现
2020/10/10 Python
.NET里面如何取得当前的屏幕分辨率
2012/12/06 面试题
经贸日语毕业生自荐信
2013/11/03 职场文书
销售工作人员的自我评价分享
2013/11/10 职场文书
业务员薪酬管理制度
2014/01/15 职场文书
《鞋匠的儿子》教学反思
2014/03/02 职场文书
传播学专业毕业生自荐书
2014/07/01 职场文书
大学生迟到检讨书500字
2014/10/17 职场文书
研究生导师推荐信
2015/03/25 职场文书
银行实习推荐信
2015/03/27 职场文书
运动会表扬稿范文
2015/05/05 职场文书
三国演义读书笔记
2015/06/25 职场文书
婚礼双方父亲致辞
2015/07/27 职场文书
2015年“我们的节日·重阳节”活动总结
2015/07/29 职场文书
SQL 尚未定义空闲 CPU 条件 - OnIdle 作业计划将不起任何作用
2021/06/30 SQL Server