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 相关文章推荐
写了一个layout,拖动条连贯,内容区可为iframe
Aug 19 Javascript
js 鼠标移动显示图片的简单实例
Dec 25 Javascript
限制文本框只能输入数字||只能是数字和小数点||只能是整数和浮点数
May 27 Javascript
js 判断数据类型的几种方法
Jan 13 Javascript
Node.js之网络通讯模块实现浅析
Apr 01 Javascript
Vue路由跳转问题记录详解
Jun 15 Javascript
JS中的Replace()传入函数时的用法详解
Sep 11 Javascript
Vue中v-for的数据分组实例
Mar 07 Javascript
jQuery插件实现的日历功能示例【附源码下载】
Sep 07 jQuery
Vue使用mixin分发组件的可复用功能
Sep 01 Javascript
countup.js实现数字动态叠加效果
Oct 17 Javascript
解决Can't find variable: SockJS vue项目的问题
Sep 22 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保存和输出图片
2006/10/09 PHP
phpwind中的数据库操作类
2007/01/02 PHP
五款PHP代码重构工具推荐
2014/10/14 PHP
php微信公众号开发之校园图书馆
2018/10/20 PHP
提高网站性能之 如何对待JavaScript
2009/10/31 Javascript
Wordpress ThickBox 添加“查看原图”效果代码
2010/12/11 Javascript
iframe的onload在Chrome/Opera中执行两次Bug的解决方法
2011/03/17 Javascript
JQuery入门—编写一个简单的JQuery应用案例
2013/01/03 Javascript
jQuery Mobile 导航栏代码
2013/11/01 Javascript
NodeJS的url截取模块url-extract的使用实例
2013/11/18 NodeJs
JS 操作Array数组的方法及属性实例解析
2014/01/08 Javascript
一个简单的jquery进度条示例
2014/04/28 Javascript
JS实现超炫网页烟花动画效果的方法
2015/03/02 Javascript
JavaScript控制网页层收起和展开效果的方法
2015/04/15 Javascript
javascript瀑布流式图片懒加载实例解析与优化
2016/02/23 Javascript
js 获取本地文件及目录的方法(推荐)
2016/11/10 Javascript
JavaScript学习总结之正则的元字符和一些简单的应用
2017/06/30 Javascript
jQuery实现ajax回调函数带入参数的方法示例
2018/06/26 jQuery
JavaScript引用类型Date常见用法实例分析
2018/08/08 Javascript
解决Layui选择全部,换页checkbox复选框重新勾选的问题方法
2018/08/14 Javascript
vue实现一个炫酷的日历组件
2018/10/08 Javascript
JavaScript数组特性与实践应用深入详解
2018/12/30 Javascript
JS实现商品橱窗特效
2020/01/09 Javascript
JavaScript字符和ASCII实现互相转换
2020/06/03 Javascript
详解Python中列表和元祖的使用方法
2015/04/25 Python
最大K个数问题的Python版解法总结
2016/06/16 Python
用Python写一个模拟qq聊天小程序的代码实例
2019/03/06 Python
python+openCV利用摄像头实现人员活动检测
2019/06/22 Python
Windows上安装tensorflow  详细教程(图文详解)
2020/02/04 Python
移动端html5 meta标签的神奇功效
2016/01/06 HTML / CSS
美国豪华时尚女性精品店:Kirna Zabête
2018/01/11 全球购物
简历自我评价怎么写呢?
2014/01/06 职场文书
艺术设计专业个人求职信
2014/04/10 职场文书
2014年电教工作总结
2014/12/19 职场文书
大国崛起观后感
2015/06/02 职场文书
mysql查看表结构的三种方法总结
2022/07/07 MySQL