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 相关文章推荐
jquery+json实现的搜索加分页效果
Mar 31 Javascript
关于文本框的一些限制控制总结~~
Apr 15 Javascript
jquery tab插件精简版分享
Sep 10 Javascript
IE、FF、Chrome浏览器中的JS差异介绍
Aug 13 Javascript
可选择和输入的下拉列表框示例
Nov 05 Javascript
js鼠标及对象坐标控制属性详细解析
Dec 14 Javascript
jQuery遍历之next()、nextAll()方法使用实例
Nov 08 Javascript
JS实现让网页背景图片斜向移动的方法
Feb 25 Javascript
使用jquery提交form表单并自定义action的方法
May 25 Javascript
深入理解JS继承和原型链的问题
Dec 17 Javascript
vue.js2.0 实现better-scroll的滚动效果实例详解
Aug 13 Javascript
JS+css3实现幻灯片轮播图
Aug 14 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
php 代码优化之经典示例
2011/03/24 PHP
利用phpexcel把excel导入数据库和数据库导出excel实现
2014/01/09 PHP
PHP获取浏览器信息类和客户端地理位置的2个方法
2014/04/24 PHP
服务端 VBScript 与 JScript 几个相同特性的写法 By shawl.qiu
2007/03/06 Javascript
离开当前页面前使用js判断条件提示是否要离开页面
2014/05/02 Javascript
Jquery EasyUI实现treegrid上显示checkbox并取选定值的方法
2016/04/29 Javascript
学习Node.js模块机制
2016/10/17 Javascript
常用JS图片滚动(无缝、平滑、上下左右滚动)代码大全(推荐)
2016/12/20 Javascript
详解vue slot插槽的使用方法
2017/06/13 Javascript
使用vue 国际化i18n 实现多实现语言切换功能
2018/10/11 Javascript
引入外部js脚本加载慢与页面白屏问题的解决
2018/12/10 Javascript
javascript实现blob加密视频源地址的方法
2019/08/08 Javascript
layui自己添加图片按钮并点击跳转页面的例子
2019/09/14 Javascript
vue 实现移动端键盘搜索事件监听
2019/11/06 Javascript
Vue中的nextTick作用和几个简单的使用场景
2021/01/25 Vue.js
[53:13]2014 DOTA2国际邀请赛中国区预选赛5.21 DT VS LGD-GAMING
2014/05/22 DOTA
浅谈python新手中常见的疑惑及解答
2016/06/14 Python
Python中多线程的创建及基本调用方法
2016/07/08 Python
python版飞机大战代码分享
2018/11/20 Python
解决Django Static内容不能加载显示的问题
2019/07/28 Python
Python3 无重复字符的最长子串的实现
2019/10/08 Python
如何通过安装HomeBrew来安装Python3
2020/12/23 Python
学点简单的Django之第一个Django程序的实现
2021/02/24 Python
HTML5中原生的右键菜单创建方法
2016/06/28 HTML / CSS
Jeep牧马人、切诺基和自由人零配件:4 Wheel Drive Hardware
2017/07/02 全球购物
Tory Burch英国官方网站:美国时尚生活品牌
2017/12/06 全球购物
Nice Kicks网上商店:ShopNiceKicks.com
2018/12/25 全球购物
Gloeilampgoedkoop荷兰:在线购买灯泡
2019/02/16 全球购物
医科大学生的自我评价
2013/12/04 职场文书
高中英语教学反思
2014/02/04 职场文书
有趣的广告词
2014/03/18 职场文书
大学生在校表现评语
2014/12/31 职场文书
2015教师年度思想工作总结
2015/04/30 职场文书
Python入门之基础语法详解
2021/05/11 Python
python中使用 unittest.TestCase单元测试的用例详解
2021/08/30 Python
Golang 实现WebSockets
2022/04/24 Golang