JavaScript实现为事件句柄绑定监听函数的方法分析


Posted in Javascript onNovember 14, 2017

本文实例讲述了JavaScript实现为事件句柄绑定监听函数的方法。分享给大家供大家参考,具体如下:

在JavaScript中为Dom元素绑定事件监听函数是一件非常常见的事情,但这里也有许多的Bug。各种浏览器对于事件绑定都提供了很多方法,但可靠的只有3中:

1、传统的绑定方法:

elem.onclick = function( event ){
  alert(event.type + 'this.innerHTML');
};

a、传统的绑定方法,非常简单稳定,函数体内的this指向的也是指向正在处理事件的节点(如当前正在运行事件句柄的节点)。

b、一个元素的一个事件句柄只能注册一个函数,如果重复注册,会产生覆盖;而且,传统绑定方法只会在事件冒泡中运行。

2、W3C标准绑定方法:

var elem = document.getElementById('ID');
elem.addEventListener('click' ,
          function( event ){
            alert(event.type + ' ' + this.innerHTML + 1);
          } ,
          false  //冒泡阶段执行
);
elem.addEventListener('click' ,
          function( event ){
            alert(event.type + ' ' + this.innerHTML + 2);
          } ,
          false
);

a、这种绑定方法同时支持时间处理的捕获和冒泡两个阶段;同一元素的同一事件句柄可以注册多个监听函数;而且,监听函数内部this指向当前元素。

b、但是流行的IE浏览器不支持这种注册方法。

3、IE事件句柄注册方法:

var elem = document.getElementById('a');
elem.attachEvent('onclick' ,
  function(){
    alert(window.event.srcElement.innerHTML + ' ' + this.innerHTML + 1);
  }
);
elem.attachEvent('onclick' ,
  function(){
    alert(window.event.srcElement.innerHTML + ' ' + this.innerHTML + 2);
  }
);

a、这种绑定方法,可以为同一事件句柄注册多次。

b、IE的事件模型不支持事件捕获;监听函数体内的this指向的不是当前于元素,而且window.event.srcElement指向的是发生事件的节点,而不是当前节点,并且在IE的事件对象中也没有等价的DOM currentTarget属性。

4、跨浏览器的方法一:

function addEvent(element, type, handler) {
 if (!handler.guid)handler.guid = addEvent.guid++;
 if (!element.events) element.events = {};
 var handlers = element.events[type];
 if (!handlers) {
  handlers = element.events[type] = {};
  if (element["on" + type]) {
   handlers[0] = element["on" + type];
  }
 }
 handlers[handler.$$guid] = handler;
 element["on" + type] = handleEvent;
};
addEvent.guid = 1;
function removeEvent(element, type, handler) {
 if (element.events && element.events[type]) {
  delete element.events[type][handler.$$guid];
 }
};
function handleEvent(event) {
 var returnValue = true;
 event = event || fixEvent(window.event);
 var handlers = this.events[event.type];
 for (var i in handlers) {
  this.$$handleEvent = handlers[i];
  if (this.$$handleEvent(event) === false) {
   returnValue = false;
  }
 }
 return returnValue;
};
function fixEvent(event) {
 event.preventDefault = fixEvent.preventDefault;
 event.stopPropagation = fixEvent.stopPropagation;
 return event;
};
fixEvent.preventDefault = function() {
 this.returnValue = false;
};
fixEvent.stopPropagation = function() {
 this.cancelBubble = true;
};

以上代码由是有 Dean EdwardsaddEvent/removeEven

5、跨浏览器的方法二:

function addEvent( obj, type, fn ) {
 if ( obj.attachEvent ) {
  obj['e'+type+fn] = fn;
  obj[type+fn] = function(){obj['e'+type+fn]( window.event );}
  obj.attachEvent( 'on'+type, obj[type+fn] );
 } else
  obj.addEventListener( type, fn, false );
}
function removeEvent( obj, type, fn ) {
 if ( obj.detachEvent ) {
  obj.detachEvent( 'on'+type, obj[type+fn] );
  obj[type+fn] = null;
 } else
  obj.removeEventListener( type, fn, false );
}

另外,事件流可分为冒泡型事件和捕获型事件,HTML元素大都包含了自己的默认行为,例如:超链接、提交按钮等。我们可以通过在绑定事件中加上"return false"来阻止它的默认行为。感兴趣的拼音可参考本站js之事件冒泡和事件捕获详细介绍上的相关介绍。

PS:这里再为大家附上javascript系统自带事件参考表供大家参考查询:

javascript事件与功能说明大全:
http://tools.3water.com/table/javascript_event

更多关于JavaScript相关内容可查看本站专题:《JavaScript事件相关操作与技巧大全》、《JavaScript常用函数技巧汇总》、《javascript面向对象入门教程》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》及《JavaScript数学运算用法总结》

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
Javascript学习笔记4 Eval函数
Jan 11 Javascript
jQuery Animation实现CSS3动画示例介绍
Aug 14 Javascript
jQuery封装的获取Url中的Get参数示例
Nov 26 Javascript
jquery实现表单验证简单实例演示
Nov 23 Javascript
微信小程序 label 组件详解及简单实例
Jan 10 Javascript
浅谈jQuery中事情的动态绑定
Feb 12 Javascript
jQuery插件FusionCharts绘制的3D环饼图效果示例【附demo源码】
Apr 02 jQuery
jQuery Position方法使用和兼容性
Aug 23 jQuery
Vue.js 点击按钮显示/隐藏内容的实例代码
Feb 08 Javascript
KOA+egg.js集成kafka消息队列的示例
Nov 09 Javascript
用VueJS写一个Chrome浏览器插件的实现方法
Feb 27 Javascript
详解Vue.js3.0 组件是如何渲染为DOM的
Nov 10 Javascript
JavaScript函数绑定用法实例分析
Nov 14 #Javascript
cordova入门基础教程及使用中遇到的一些问题总结
Nov 14 #Javascript
JS实现获取汉字首字母拼音、全拼音及混拼音的方法
Nov 14 #Javascript
JS中图片压缩的方法小结
Nov 14 #Javascript
前端html中jQuery实现对文本的搜索功能并把搜索相关内容显示出来
Nov 14 #jQuery
Node.js使用Express.Router的方法
Nov 14 #Javascript
js精确的加减乘除实例
Nov 14 #Javascript
You might like
生成卡号php代码
2008/04/09 PHP
php通过文件头检测文件类型通用代码类(zip,rar等)
2010/10/19 PHP
PHP5下$_SERVER变量不再受magic_quotes_gpc保护的弥补方法
2012/10/31 PHP
定义php常量的详解
2013/06/09 PHP
IIS安装Apache伪静态插件的具体操作图文
2013/07/01 PHP
调整PHP的性能
2013/10/30 PHP
解决php表单重复提交实现方法
2015/09/29 PHP
thinkphp5+layui实现的分页样式示例
2019/10/08 PHP
一些常用的JavaScript函数(json)附详细说明
2011/05/25 Javascript
JSON.stringify 语法实例讲解
2012/03/14 Javascript
两种方法实现文本框输入内容提示消失
2013/03/17 Javascript
jquery清空textarea等输入框实现代码
2013/04/22 Javascript
当前页禁止复制粘贴截屏代码小集
2013/07/24 Javascript
js实现图片和链接文字同步切换特效的方法
2015/02/20 Javascript
Javascript实现可旋转的圆圈实例代码
2015/08/04 Javascript
JS实现来回出现文字的状态栏特效代码
2015/10/31 Javascript
jQuery实现ajax的叠加和停止(终止ajax请求)
2016/08/08 Javascript
Vue computed计算属性的使用方法
2017/07/14 Javascript
微信小程序实现自定义加载图标功能
2018/07/19 Javascript
基于elementUI实现图片预览组件的示例代码
2019/03/31 Javascript
vue.js实现左边导航切换右边内容
2019/10/21 Javascript
微信小程序实现可拖动悬浮图标(包括按钮角标的实现)
2020/12/29 Javascript
讲解Python中if语句的嵌套用法
2015/05/14 Python
Python学习笔记整理3之输入输出、python eval函数
2015/12/14 Python
查找python项目依赖并生成requirements.txt的方法
2018/07/10 Python
Sanic框架基于类的视图用法示例
2018/07/18 Python
python 获取图片分辨率的方法
2019/01/08 Python
python使用PIL和matplotlib获取图片像素点并合并解析
2019/09/10 Python
python tkinter组件使用详解
2019/09/16 Python
pytorch下使用LSTM神经网络写诗实例
2020/01/14 Python
python实现逆滤波与维纳滤波示例
2020/02/26 Python
浅谈keras中的batch_dot,dot方法和TensorFlow的matmul
2020/06/18 Python
英国曼彻斯特宠物用品品牌:Bunty Pet Products
2019/07/27 全球购物
介绍一下XMLHttpRequest对象的常用方法和属性
2013/05/24 面试题
就业自我评价
2014/02/04 职场文书
幼儿园见习报告范文
2014/10/30 职场文书