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 相关文章推荐
window.open被浏览器拦截后的自定义提示效果代码
Nov 19 Javascript
Javascript 的addEventListener()及attachEvent()区别分析
May 21 Javascript
javascript面向对象之二 命名空间
Feb 08 Javascript
javascript笔记 String类replace函数的一些事
Sep 22 Javascript
js 事件截取enter按键页面提交事件示例代码
Mar 04 Javascript
JS实现简单的图书馆享元模式实例
Jun 30 Javascript
js淡入淡出的图片轮播效果代码分享
Aug 24 Javascript
基于JavaScript代码实现微信扫一扫下载APP
Dec 30 Javascript
完美解决jQuery fancybox ie 无法显示关闭按钮的问题
Nov 29 Javascript
在JavaScript中如何访问暂未存在的嵌套对象
Jun 18 Javascript
ElementUI Tag组件实现多标签生成的方法示例
Jul 08 Javascript
浅谈layui框架自带分页和表格重载的接口解析问题
Sep 11 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
Laravel jwt 多表(多用户端)验证隔离的实现
2019/12/18 PHP
window.dialogArguments 使用说明
2011/04/11 Javascript
30个让人兴奋的视差滚动(Parallax Scrolling)效果网站
2012/03/04 Javascript
kindeditor编辑器点中图片滚动条往上顶的bug
2015/07/05 Javascript
JS实现单击输入框弹出选择框效果完整实例
2015/12/14 Javascript
全面解析Bootstrap中scrollspy(滚动监听)的使用方法
2016/06/06 Javascript
JavaScript该如何学习 怎样轻松学习JavaScript
2017/06/12 Javascript
使用JavaScript实现alert的实例代码
2017/07/06 Javascript
Node中使用ES6语法的基础教程
2018/01/05 Javascript
vue自定义指令directive实例详解
2018/01/17 Javascript
vue全局组件与局部组件使用方法详解
2018/03/29 Javascript
vue3.0 CLI - 3.2 路由的初级使用教程
2018/09/20 Javascript
JavaScript两种计时器的实例讲解
2019/01/31 Javascript
JavaScript常用工具方法封装
2019/02/12 Javascript
基于JavaScript实现单例模式
2019/10/30 Javascript
[01:56]《DOTA2》中文配音CG
2013/04/22 DOTA
python在linux中输出带颜色的文字的方法
2014/06/19 Python
Python基于回溯法子集树模板解决旅行商问题(TSP)实例
2017/09/05 Python
python中cPickle类使用方法详解
2018/08/27 Python
Python中函数的基本定义与调用及内置函数详解
2019/05/13 Python
简单了解python 生成器 列表推导式 生成器表达式
2019/08/22 Python
Python进程,多进程,获取进程id,给子进程传递参数操作示例
2019/10/11 Python
Python实现CAN报文转换工具教程
2020/05/05 Python
澳大利亚领先的孕妇服装品牌:Mamaway
2018/08/14 全球购物
美国领先的低折扣旅行网站:Hotwire
2019/01/19 全球购物
自我评价个人范文
2013/12/16 职场文书
《两只鸟蛋》教学反思
2014/02/10 职场文书
一年级小学生评语
2014/04/22 职场文书
食品工程专业求职信
2014/06/15 职场文书
销售经理岗位职责范本
2015/04/02 职场文书
学校通报表扬范文
2015/05/04 职场文书
2015秋季新学期开学寄语
2015/05/28 职场文书
值班管理制度范本
2015/08/06 职场文书
pytorch 如何使用amp进行混合精度训练
2021/05/24 Python
Linux下使用C语言代码搭建一个简单的HTTP服务器
2022/04/13 Servers
Hive HQL支持2种查询语句风格
2022/06/25 数据库