Javascript添加事件跨浏览器功能实现:使用attachEvent / addEventListener与内联事件

为了添加事件,我们可以使用这个简单的第一个解决方案:
function AddEvent(html_element,event_name,event_function) 
{       
   if(html_element.attachEvent) //Internet Explorer
      html_element.attachEvent("on" + event_name,function() {event_function.call(html_element);}); 
   else if(html_element.addEventListener) //Firefox & company
      html_element.addEventListener(event_name,event_function,false); //don't need the 'call' trick because in FF everything already works in the right way          
}

或第二个解决方案(增加内联事件):

function AddEvent(html_element,event_function) 
{       
   var old_event = html_element['on' + event_name];
   if(typeof old_event !== 'function')
      html_element['on' + event_name] = function() { event_function.call(html_element); };
   else
      html_element['on' + event_name] = function() { old_event(); event_function.call(html_element); };
}

这些都是跨浏览器,可以这样使用:

AddEvent(document.getElementById('some_div_id'),'click',function() 
{             
   alert(this.tagName); //shows 'DIV'
});

由于我有感觉attachEvent / addEventListener在更多的事件处理实现中使用,我想知道:

使用第二种解决方案有哪些缺点/缺点,我可能会更好地意识到?

我可以看到两个,但我对更多的兴趣(如果有的话):

>第二个解决方案通过在线添加事件来拧紧元素的innerHTML
>使用第二个解决方案我可以轻松地删除与某个事件类型相关联的所有功能(html_element [‘on’event_name] = null),但是我不能使用detachEvent / removeEventListener来完全删除一个特定的函数.

任何答案如:“使用jQuery”或任何其他FW是无意义的!

解决方法

使用第二个解决方案,您必须手动调用以前的功能,使得很难删除特定的听众(对我来说,听起来像你想要的东西,而不是清除所有听众),而在第一个解决方案中,您只能同时清除它们,除非您要模拟第一个功能.

就个人而言,我总是使用第一个解决方案,因为它具有不必担心清除可能的其他事件监听器的优点.

mozilla wiki还列出了第一个解决方案适用于任何DOM元素,而不仅仅是HTML元素的优点,并且它允许在侦听器使用第三个参数激活(捕获与冒泡)时对相位进行更精细的粒度控制.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


什么是深拷贝与浅拷贝?深拷贝与浅拷贝是js中处理对象或数据复制操作的两种方式。‌在聊深浅拷贝之前咱得了解一下js中的两种数据类型:
前言 今天复习了一些前端算法题,写到一两道比较有意思的题:重建二叉树、反向输出链表每个节点 题目 重建二叉树: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列 {1,2,4,7,3,5,6,8} 和中序遍历序列 {
最近在看回JavaScript的面试题,this 指向问题是入坑前端必须了解的知识点,现在迎来了ES6+的时代,因为箭头函数的出现,所以感觉有必要对 this 问题梳理一下,所以刚好总结一下JavaScript中this指向的问题。
js如何实现弹出form提交表单?(图文+视频)
js怎么获取复选框选中的值
js如何实现倒计时跳转页面
如何用js控制图片放大缩小
JS怎么获取当前时间戳
JS如何判断对象是否为数组
JS怎么获取图片当前宽高
JS对象如何转为json格式字符串
JS怎么获取图片原始宽高
怎么在click事件中调用多个js函数
js如何往数组中添加新元素
js如何拆分字符串
JS怎么对数组内元素进行求和
JS如何判断屏幕大小
js怎么解析json数据
js如何实时获取浏览器窗口大小
原生JS实现别踩白块小游戏(五)