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函数
Jul 21 Javascript
js防止表单重复提交的两种方法
Sep 30 Javascript
jQuery简单实现banner图片切换
Jan 02 Javascript
jquery等待效果示例
May 01 Javascript
JavaScript模拟深蓝vs卡斯帕罗夫的国际象棋对局示例
Apr 22 Javascript
一张Web前端的思维导图分享
Jul 03 Javascript
jQuery中animate()的使用方法及解决$(”body“).animate({“scrollTop”:top})不被Firefox支持的问题
Apr 04 jQuery
微信小程序微信支付接入开发实例详解
Apr 12 Javascript
jQuery使用ajax_动力节点Java学院整理
Jul 05 jQuery
详解Vue + Vuex 如何使用 vm.$nextTick
Nov 20 Javascript
JS实现的input选择图片本地预览功能示例
Aug 29 Javascript
Javascript执行流程细节原理解析
May 14 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+mysql实现的无限分类方法类定义与使用示例
2020/05/27 PHP
javascript 混合的构造函数和原型方式,动态原型方式
2009/12/07 Javascript
javascript 模拟点击广告
2010/01/02 Javascript
jQuery 获取对象 根据属性、内容匹配, 还有表单元素匹配
2010/05/31 Javascript
jQuery获取css z-index在各种浏览器中的返回值
2010/09/15 Javascript
javascript的数据类型、字面量、变量介绍
2012/05/23 Javascript
js indexOf()定义和用法
2012/10/21 Javascript
JavaScript创建一个欢迎cookie弹出窗实现代码
2013/03/15 Javascript
jQuery输入城市查看地图使用介绍
2013/05/08 Javascript
JS两种定义方式的区别、内部原理
2013/11/21 Javascript
jQuery select表单提交省市区城市三级联动核心代码
2014/06/09 Javascript
jQuery异步加载数据并添加事件示例
2014/08/24 Javascript
JavaScript 事件绑定及深入
2015/04/13 Javascript
JavaScript判断对象是否为数组
2015/12/22 Javascript
理解jquery事件冒泡
2016/01/03 Javascript
JS实现获取剪贴板内容的方法
2016/06/21 Javascript
使用Vue.js和Element-UI做一个简单登录页面的实例
2018/02/23 Javascript
详解如何在Vue里建立长按指令
2018/08/20 Javascript
vue中将html字符串转换成html后遇到的问题小结
2018/12/10 Javascript
Javascript模拟实现new原理解析
2020/03/03 Javascript
谈谈Python进行验证码识别的一些想法
2016/01/25 Python
python实现简单聊天应用 python群聊和点对点均实现
2017/09/14 Python
用python的requests第三方模块抓取王者荣耀所有英雄的皮肤实例
2017/12/14 Python
python实现最长公共子序列
2018/05/22 Python
Python3 Post登录并且保存cookie登录其他页面的方法
2018/12/28 Python
Pandas中resample方法详解
2019/07/02 Python
Python代码块及缓存机制原理详解
2019/12/13 Python
TensorFlow实现打印每一层的输出
2020/01/21 Python
波兰在线杂货店:Polski Koszyk
2019/11/02 全球购物
日期和时间问题
2015/01/04 面试题
土建资料员岗位职责
2014/01/04 职场文书
会计专业求职信
2014/08/10 职场文书
消防志愿者活动方案
2014/08/23 职场文书
运动会演讲稿300字
2014/08/25 职场文书
致运动员赞词
2015/07/22 职场文书
党性教育心得体会(共6篇)
2016/01/21 职场文书