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 相关文章推荐
PJ Blog修改-禁止复制的代码和方法
Oct 25 Javascript
Javascript 事件流和事件绑定
Jul 16 Javascript
javascript中类的定义及其方式(《javascript高级程序设计》学习笔记)
Jul 04 Javascript
一个非常全面的javascript URL解析函数和分段URL解析方法
Apr 12 Javascript
JavaScript获取网页、浏览器、屏幕高度和宽度汇总
Dec 18 Javascript
js实现ifram取父窗口URL地址的方法
Feb 09 Javascript
JavaScript 实现完美兼容多浏览器的复制功能代码
Apr 28 Javascript
javascript事件冒泡和事件捕获详解
May 26 Javascript
jquery延迟对象解析
Oct 26 Javascript
react PropTypes校验传递的值操作示例
Apr 28 Javascript
浅谈React中组件逻辑复用的那些事儿
May 21 Javascript
基于vue+echarts数据可视化大屏展示的实现
Dec 25 Vue.js
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
动画 《Pokemon Sword·Shield》系列WEB动画《薄明之翼》第2话声优阵容公开!
2020/03/06 日漫
php中文字符截取防乱码
2008/03/28 PHP
解析php函数method_exists()与is_callable()的区别
2013/06/21 PHP
Zend studio文件注释模板设置方法
2013/09/29 PHP
Laravel 修改默认日志文件名称和位置的例子
2019/10/17 PHP
javascript cookie解码函数(兼容ff)
2008/03/17 Javascript
JavaScript 克隆数组最简单的方法
2009/02/12 Javascript
JavaScript prototype对象的属性说明
2010/03/13 Javascript
JavaScript可否多线程? 深入理解JavaScript定时机制
2012/05/23 Javascript
基于jquery自定义图片热区效果
2012/07/21 Javascript
纯js网页画板(Graphics)类简介及实现代码
2012/12/24 Javascript
javascript 3d 逐侦产品展示(核心精简)
2014/03/26 Javascript
深入了解JavaScript中的Symbol的使用方法
2015/07/28 Javascript
简单的JS控制button颜色随点击更改的实现方法
2017/04/17 Javascript
Vue.use源码分析
2017/04/22 Javascript
jQuery实现frame之间互通的方法
2017/06/26 jQuery
JavaScript动态创建二维数组的方法示例
2019/02/01 Javascript
es6函数之尾调用优化实例分析
2020/04/25 Javascript
pycharm 使用心得(七)一些实用功能介绍
2014/06/06 Python
Python使用Pycrypto库进行RSA加密的方法详解
2016/06/06 Python
Python编程实战之Oracle数据库操作示例
2017/06/21 Python
Python使用windows设置定时执行脚本
2020/11/12 Python
python3 os进行嵌套操作的实例讲解
2020/11/19 Python
python 高阶函数简单介绍
2021/02/19 Python
HTML5 canvas实现移动端上传头像拖拽裁剪效果
2016/03/14 HTML / CSS
Canvas中设置width与height的问题浅析
2018/11/01 HTML / CSS
如何用Lucene索引数据库
2016/02/23 面试题
学员自我鉴定
2014/03/19 职场文书
大学新生军训方案
2014/05/03 职场文书
公司周年庆典策划方案
2014/05/17 职场文书
党员承诺书怎么写
2014/05/20 职场文书
2015年反洗钱工作总结
2015/04/25 职场文书
2015年社区科普工作总结
2015/05/13 职场文书
导游词之丹东鸭绿江
2019/10/24 职场文书
导游词之日本富士山
2020/01/06 职场文书
Windows 11要来了?微软文档揭示Win11太阳谷 / Win10有两个不同版本
2021/11/21 数码科技