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封装的不错的选项卡效果代码
Feb 15 Javascript
javascript小数计算出现近似值的解决办法
Feb 06 Javascript
基于jquery的图片懒加载js
Jun 30 Javascript
javascript检测浏览器flash版本的实现代码
Dec 06 Javascript
页面只能打开一次Cooike如何实现
Dec 04 Javascript
jsvascript图像处理—(计算机视觉应用)图像金字塔
Jan 15 Javascript
js单向链表的具体实现实例
Jun 21 Javascript
jquery访问ashx文件示例代码
Aug 11 Javascript
js onmousewheel事件多次触发问题解决方法
Oct 17 Javascript
JavaScript、C# URL编码、解码总结
Jan 21 Javascript
微信小程序单选radio及多选checkbox按钮用法示例
Apr 30 Javascript
JS回调函数深入理解
Oct 16 Javascript
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(1)
2006/10/09 PHP
php curl 登录163邮箱并抓取邮箱好友列表的代码(经测试)
2011/04/07 PHP
PHP连接MongoDB示例代码
2012/09/06 PHP
header跳转和include包含问题详解
2012/09/08 PHP
Laravel中的chunk组块结果集处理与注意问题
2018/08/15 PHP
textarea的value是html文件源代码,存成html文件的代码
2007/04/20 Javascript
网上抓的一个特效
2007/05/11 Javascript
javascript 页面只自动刷新一次
2009/07/10 Javascript
阻止事件(取消浏览器对事件的默认行为并阻止其传播)
2013/11/03 Javascript
JS中实现简单Formatter函数示例代码
2014/08/19 Javascript
JavaScript实现点击单选按钮改变输入框中文本域内容的方法
2015/08/12 Javascript
javascript中字体浮动效果的简单实例演示
2015/11/18 Javascript
浅析Javascript中bind()方法的使用与实现
2016/05/30 Javascript
详解jQuery的Cookie插件
2016/11/23 Javascript
jQuery将表单序列化成一个Object对象的实例
2016/11/29 Javascript
Vue2学习笔记之请求数据交互vue-resource
2017/02/23 Javascript
vue的无缝滚动组件vue-seamless-scroll实例
2017/12/18 Javascript
webstorm中vue语法的支持详解
2018/05/09 Javascript
如何解决.vue文件url引用文件的问题
2019/01/18 Javascript
微信小程序中使用Async-await方法异步请求变为同步请求方法
2019/03/28 Javascript
实用的 vue tags 创建缓存导航的过程实现
2020/12/03 Vue.js
python3写爬取B站视频弹幕功能
2017/12/22 Python
Python使用logging模块实现打印log到指定文件的方法
2018/09/05 Python
Qoo10马来西亚:全球时尚和引领潮流的购物市场
2016/08/25 全球购物
家得宝加拿大家装网上商店:The Home Depot加拿大
2016/08/27 全球购物
Lentiamo比利时:便宜的隐形眼镜
2020/02/14 全球购物
LINUX下线程,GDI类的解释
2016/12/14 面试题
Python里面search()和match()的区别
2016/09/21 面试题
DIY蛋糕店的创业计划书范文
2013/12/26 职场文书
副厂长岗位职责
2014/02/02 职场文书
小学校长先进事迹材料
2014/05/13 职场文书
房屋产权证明书
2014/10/15 职场文书
三方股东合作协议书
2014/10/28 职场文书
小学班主任经验交流材料
2014/12/16 职场文书
vue首次渲染全过程
2021/04/21 Vue.js
Mysql的Table doesn't exist问题及解决
2022/12/24 MySQL