JavaScript实现为事件句柄绑定监听函数的方法分析


Posted in Javascript onNovember 14, 2017

本文实例讲述了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;
};

以上代码由是有 Dean EdwardsaddEvent/removeEven

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 );
}

另外,事件流可分为冒泡型事件和捕获型事件,HTML元素大都包含了自己的默认行为,例如:超链接、提交按钮等。我们可以通过在绑定事件中加上"return false"来阻止它的默认行为。感兴趣的拼音可参考本站js之事件冒泡和事件捕获详细介绍上的相关介绍。

PS:这里再为大家附上javascript系统自带事件参考表供大家参考查询:

javascript事件与功能说明大全:
http://tools.3water.com/table/javascript_event

更多关于JavaScript相关内容可查看本站专题:《JavaScript事件相关操作与技巧大全》、《JavaScript常用函数技巧汇总》、《javascript面向对象入门教程》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》及《JavaScript数学运算用法总结》

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
利用Ext Js生成动态树实例代码
Sep 08 Javascript
28个JS验证函数收集
Mar 02 Javascript
jquery.simple.tree插件 更简单,兼容性更好的无限树插件
Sep 03 Javascript
JQUERY实现网页右下角固定位置展开关闭特效的方法
Jul 27 Javascript
JavaScript中this的9种应用场景及三种复合应用场景
Sep 12 Javascript
JavaScript代码实现禁止右键、禁选择、禁粘贴、禁shift、禁ctrl、禁alt
Nov 17 Javascript
BootStrap智能表单实战系列(十一)级联下拉的支持
Jun 13 Javascript
Vue.js 60分钟快速入门教程
Mar 28 Javascript
详解Vue.js基于$.ajax获取数据并与组件的data绑定
May 26 Javascript
微信小程序实现图片上传功能实例(前端+PHP后端)
Jan 10 Javascript
js判断传入时间和当前时间大小实例(超简单)
Jan 11 Javascript
Express 配置HTML页面访问的实现
Nov 01 Javascript
JavaScript函数绑定用法实例分析
Nov 14 #Javascript
cordova入门基础教程及使用中遇到的一些问题总结
Nov 14 #Javascript
JS实现获取汉字首字母拼音、全拼音及混拼音的方法
Nov 14 #Javascript
JS中图片压缩的方法小结
Nov 14 #Javascript
前端html中jQuery实现对文本的搜索功能并把搜索相关内容显示出来
Nov 14 #jQuery
Node.js使用Express.Router的方法
Nov 14 #Javascript
js精确的加减乘除实例
Nov 14 #Javascript
You might like
自动跳转中英文页面
2006/10/09 PHP
php中字符串和正则表达式详解
2014/10/23 PHP
php实现在线通讯录功能(附源码)
2016/05/13 PHP
php魔法函数与魔法常量使用介绍
2017/07/23 PHP
PHP parse_ini_file函数的应用与扩展操作示例
2019/01/07 PHP
jQuery的写法不同导致的兼容性问题的解决方法
2010/07/29 Javascript
单击复制文字兼容各浏览器的完美解决方案
2013/07/04 Javascript
JavaScript对象学习经验整理
2013/10/12 Javascript
JS控件ASP.NET的treeview控件全选或者取消(示例代码)
2013/12/16 Javascript
Javascript中的String对象详谈
2014/03/03 Javascript
javascript生成随机数的方法
2014/05/16 Javascript
搭建pomelo 开发环境
2014/06/24 Javascript
javascript 事件处理示例分享
2014/12/31 Javascript
Jquery 自定义事件实现发布/订阅的简单实例
2016/06/12 Javascript
微信开发 使用picker封装省市区三级联动模板
2016/10/28 Javascript
js 中rewrap-ajax.js插件实例代码
2017/10/20 Javascript
使用js原生实现年份轮播选择效果实例
2021/01/12 Javascript
[02:40]DOTA2英雄基础教程 炼金术士
2013/12/23 DOTA
[03:55]显微镜下的DOTA2特别篇——430灰烬之灵神级操作
2014/06/24 DOTA
[45:34]完美世界DOTA2联赛PWL S3 Rebirth vs CPG 第一场 12.18
2020/12/19 DOTA
python检查指定文件是否存在的方法
2015/07/06 Python
Django自定义分页与bootstrap分页结合
2021/02/22 Python
Python中偏函数用法示例
2018/06/07 Python
Python mutiprocessing多线程池pool操作示例
2019/01/30 Python
Django使用消息提示简单的弹出个对话框实例
2019/11/15 Python
安装python3.7编译器后如何正确安装opnecv的方法详解
2020/06/16 Python
英国和国际包裹递送:ParcelCompare
2019/08/26 全球购物
副护士长竞聘演讲稿
2014/04/30 职场文书
奥巴马连任演讲稿
2014/05/15 职场文书
大学奖学金获奖感言
2014/08/15 职场文书
课内比教学心得体会
2014/09/09 职场文书
母亲节寄语大全
2015/02/27 职场文书
主持人开场白台词
2015/05/29 职场文书
护士业务学习心得体会
2016/01/25 职场文书
Python 如何安装Selenium
2021/05/06 Python
能用CSS实现的就不要麻烦JavaScript了
2021/10/05 HTML / CSS