JavaScript为事件句柄绑定监听函数实例详解


Posted in Javascript onDecember 15, 2015

本文实例讲述了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;
};

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 );
}

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

Javascript 相关文章推荐
js option删除代码集合
Nov 12 Javascript
EXT窗口Window及对话框MessageBox
Jan 27 Javascript
JavaScript自动设置IFrame高度的小例子
Jun 08 Javascript
Jquery getJSON方法详细分析
Dec 26 Javascript
JavaScript 实现鼠标拖动元素实例代码
Feb 24 Javascript
JS实现的相册图片左右滚动完整实例
Nov 23 Javascript
JavaScript实现数值自动增加动画
Dec 28 Javascript
浅析node应用的timing-attack安全漏洞
Feb 28 Javascript
基于three.js实现的3D粒子动效实例代码
Apr 09 Javascript
详解JavaScript自定义函数
Jul 29 Javascript
详解Java中String JSONObject JSONArray List转换
Nov 13 Javascript
基于vue-simple-uploader封装文件分片上传、秒传及断点续传的全局上传插件功能
Feb 23 Vue.js
JavaScript获取当前cpu使用率的方法
Dec 15 #Javascript
js简单网速测试方法完整实例
Dec 15 #Javascript
JQuery中Ajax()的data参数类型实例分析
Dec 15 #Javascript
理解javascript闭包
Dec 15 #Javascript
jQuery检测滚动条是否到达底部
Dec 15 #Javascript
js实现根据身份证号自动生成出生日期
Dec 15 #Javascript
浅析javascript的return语句
Dec 15 #Javascript
You might like
php下通过POST还是GET来传值
2008/06/05 PHP
PHP合并数组+号和array_merge的区别
2015/06/25 PHP
php实现处理输入转义字符的代码
2015/11/08 PHP
PHP异常类及异常处理操作实例详解
2018/12/19 PHP
JavaScript创建一个欢迎cookie弹出窗实现代码
2013/03/15 Javascript
在子窗口中关闭父窗口的一句代码
2013/10/21 Javascript
完美解决AJAX跨域问题
2013/11/01 Javascript
jquery自定义下拉列表示例
2014/04/25 Javascript
AngularJS Module方法详解
2015/12/08 Javascript
JS实现把鼠标放到链接上出现滚动文字的方法
2016/04/06 Javascript
Angular2 (RC5) 路由与导航详解
2016/09/21 Javascript
express文件上传中间件Multer详解
2016/10/24 Javascript
html中鼠标滚轮事件onmousewheel的处理方法
2016/11/11 Javascript
教大家轻松制作Bootstrap漂亮表格(table)
2016/12/13 Javascript
jquery实现弹窗功能(窗口居中显示)
2017/02/27 Javascript
详解webpack3如何正确引用并使用jQuery库
2017/08/26 jQuery
AngularJs ng-change事件/指令的用法小结
2017/11/01 Javascript
浅谈angular2子组件的事件传递(任意组件事件传递)
2018/09/30 Javascript
浅谈ECMAScript 中的Array类型
2019/06/10 Javascript
vue element-ui table组件动态生成表头和数据并修改单元格格式 父子组件通信
2019/08/15 Javascript
解决mui框架中switch开关通过js控制开或者关状态时小圆点不动的问题
2019/09/03 Javascript
jQuery实现轮播图效果demo
2020/01/11 jQuery
[02:34]肉山说——泡妞篇
2014/09/16 DOTA
python 实现12bit灰度图像映射到8bit显示的方法
2019/07/08 Python
初次部署django+gunicorn+nginx的方法步骤
2019/09/11 Python
详解Windows下PyCharm安装Numpy包及无法安装问题解决方案
2020/06/18 Python
详解Python中@staticmethod和@classmethod区别及使用示例代码
2020/12/14 Python
欧洲著名的珠宝和手表网上商城:uhrcenter
2017/04/10 全球购物
Yankee Candle官网:美国最畅销蜡烛品牌之一
2020/01/05 全球购物
介绍java中初始化块的使用
2012/09/11 面试题
优秀员工自荐书范文
2013/12/08 职场文书
致跳远、跳高运动员广播稿
2014/01/09 职场文书
报关专员求职信范文
2014/02/22 职场文书
活动总结怎么写啊
2014/05/07 职场文书
学雷锋倡议书
2015/01/19 职场文书
某某店铺的开业庆典主持词范本
2019/11/25 职场文书