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 相关文章推荐
菜单效果
Oct 14 Javascript
ToolTips JQEURY插件之简洁小提示框效果
Nov 19 Javascript
利用Javascript判断操作系统的类型实现不同操作系统下的兼容性
Jan 29 Javascript
关于eval 与new Function 到底该选哪个?
Apr 17 Javascript
原生JS实现加入收藏夹的代码
Oct 24 Javascript
一个非常全面的javascript URL解析函数和分段URL解析方法
Apr 12 Javascript
jquery自定义表单验证插件
Oct 12 Javascript
vue.js实现备忘录功能的方法
Jul 10 Javascript
javascript兼容性(实例讲解)
Aug 15 Javascript
vue项目中添加单元测试的方法
Jul 21 Javascript
微信小程序开发之map地图组件定位并手动修改位置偏差
Aug 17 Javascript
浅谈JS中几种轻松处理'this'指向方式
Sep 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
ThinkPHP令牌验证实例
2014/06/18 PHP
php针对cookie操作的队列操作类实例
2014/12/10 PHP
PHP7 新特性详细介绍
2016/09/06 PHP
遍历echsop的region表形成缓存的程序实例代码
2016/11/01 PHP
PHP数组中头部和尾部添加元素的方法(array_unshift,array_push)
2017/04/10 PHP
PHP中16个高危函数整理
2019/09/19 PHP
PhpStorm2020.1 安装 debug - Postman 调用的详细教程
2020/08/17 PHP
javascript 打印内容方法小结
2009/11/04 Javascript
node.js中的http.createClient方法使用说明
2014/12/15 Javascript
全面介绍javascript实用技巧及单竖杠
2016/07/18 Javascript
微信小程序 用户数据解密详细介绍
2017/01/09 Javascript
基于vue v-for 多层循环嵌套获取行数的方法
2018/09/26 Javascript
vue动画之点击按钮往上渐渐显示出来的实例
2018/09/29 Javascript
vue 项目接口管理的实现
2019/01/17 Javascript
Vue中props的详解
2019/05/16 Javascript
JS用最简单的方法实现四舍五入
2019/08/27 Javascript
使用 Jest 和 Supertest 进行接口端点测试实例详解
2020/04/25 Javascript
jQuery cookie的公共方法封装和使用示例
2020/06/01 jQuery
解决element-ui里的下拉多选框 el-select 时,默认值不可删除问题
2020/08/14 Javascript
详解Python编程中基本的数学计算使用
2016/02/04 Python
Python并发之多进程的方法实例代码
2018/08/15 Python
Python基于机器学习方法实现的电影推荐系统实例详解
2019/06/25 Python
Python爬虫使用代理IP的实现
2019/10/27 Python
python:目标检测模型预测准确度计算方式(基于IoU)
2020/01/18 Python
HTML5实现QQ聊天气泡效果
2017/06/26 HTML / CSS
英国在线自行车商店:Evans Cycles
2016/09/26 全球购物
我的珠宝盒:Ma boîte à bijoux
2019/08/27 全球购物
如何选择使用结构还是类
2014/05/30 面试题
linux面试题参考答案(9)
2016/01/29 面试题
电子技术专业中专生的自我评价
2013/12/17 职场文书
低碳生活倡议书
2014/04/14 职场文书
工作证明格式及范本
2014/09/12 职场文书
离婚协议书怎样才有法律效力
2014/10/10 职场文书
工作证明格式范文
2015/06/15 职场文书
MySQL数据库压缩版本安装与配置详细教程
2021/05/21 MySQL
使用Ajax实现无刷新上传文件
2022/04/12 Javascript