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 相关文章推荐
Mootools 1.2教程(21)——类(二)
Sep 15 Javascript
显示js对象所有属性和方法的函数
Oct 16 Javascript
让IE8浏览器支持function.bind()方法
Oct 16 Javascript
JS基于MSClass和setInterval实现ajax定时采集信息并滚动显示的方法
Apr 18 Javascript
浅析Bootstrap缩略图组件与警示框组件
Apr 29 Javascript
原生JS实现圣旨卷轴展开效果
Mar 06 Javascript
Angularjs 手写日历的实现代码(不用插件)
Oct 18 Javascript
JavaScript中的连续赋值问题实例分析
Jul 12 Javascript
逐行分析鸿蒙系统的 JavaScript 框架(推荐)
Sep 17 Javascript
vue-calendar-component 封装多日期选择组件的实例代码
Dec 04 Vue.js
Angular CLI发布路径的配置项浅析
Mar 29 Javascript
Vue router配置与使用分析讲解
Dec 24 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和ACCESS写聊天室(一)
2006/10/09 PHP
基于asp+ajax和数据库驱动的二级联动菜单
2010/05/06 PHP
php身份证号码检查类实例
2015/06/18 PHP
jQuery 遍历json数组的实现代码
2020/09/22 Javascript
js 小贴士一星期合集
2010/04/07 Javascript
JavaScript高级程序设计 阅读笔记(四) ECMAScript中的类型转换
2012/02/27 Javascript
IE中图片的onload事件无效问题和解决方法
2014/06/06 Javascript
Node.js开发之访问Redis数据库教程
2015/01/14 Javascript
JavaScript给input的value赋值引发的关于基本类型值和引用类型值问题
2015/12/07 Javascript
Node.js文件操作方法汇总
2016/03/22 Javascript
浅谈js多维数组和hash数组定义和使用
2016/07/27 Javascript
BootStrap入门教程(一)之可视化布局
2016/09/19 Javascript
js实现楼层导航功能
2017/02/23 Javascript
Angular2实现组件交互的方法分析
2017/12/19 Javascript
解决JS表单验证只有第一个IF起作用的问题
2018/12/04 Javascript
亲自动手实现vue日历控件
2019/06/26 Javascript
解决vue 使用setTimeout,离开当前路由setTimeout未销毁的问题
2020/07/21 Javascript
[04:16]DOTA2全国高校联赛16强抽签
2018/05/02 DOTA
Pandas 数据框增、删、改、查、去重、抽样基本操作方法
2018/04/12 Python
Python产生Gnuplot绘图数据的方法
2018/11/09 Python
对python自动生成接口测试的示例讲解
2018/11/30 Python
Python实现最常见加密方式详解
2019/07/13 Python
Python 线程池用法简单示例
2019/10/02 Python
Django操作session 的方法
2020/03/09 Python
django实现将修改好的新模型写入数据库
2020/03/31 Python
tensorflow从ckpt和从.pb文件读取变量的值方式
2020/05/26 Python
keras 使用Lambda 快速新建层 添加多个参数操作
2020/06/10 Python
python 基于UDP协议套接字通信的实现
2021/01/22 Python
html5清空画布方法(三种)
2017/10/16 HTML / CSS
全世界最美丽的四星和五星级酒店预订:Prestigia.com
2017/11/15 全球购物
Hunter Boots美国官方网站:赫特威灵顿雨靴
2018/06/16 全球购物
国际贸易专业个人求职信格式
2014/02/02 职场文书
产品推广策划方案
2014/05/10 职场文书
法学专业毕业生求职信
2014/06/12 职场文书
2014年党的群众路线整改措施思想汇报
2014/10/12 职场文书
使用Docker容器部署rocketmq单机的全过程
2022/04/03 Servers