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 相关文章推荐
javascript call方法使用说明
Jan 11 Javascript
JavaScript中的typeof操作符用法实例
Apr 05 Javascript
Javascript基础教程之for循环
Jan 18 Javascript
JS使用ajax从xml文件动态获取数据显示的方法
Mar 24 Javascript
jQuery实现表单步骤流程导航代码分享
Aug 28 Javascript
jQuery中的一些常见方法小结(推荐)
Jun 13 Javascript
vue脚手架中配置Sass的方法
Jan 04 Javascript
jQuery实现滚动到底部时自动加载更多的方法示例
Feb 18 jQuery
vue.js将时间戳转化为日期格式的实现代码
Jun 05 Javascript
Canvas实现微信红包照片效果
Aug 21 Javascript
Vue 2.0 中依赖注入 provide/inject组合实战
Jun 20 Javascript
构建大型 Vue.js 项目的10条建议(小结)
Nov 14 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
在apache下限制每个虚拟主机的并发数!!!!
2006/10/09 PHP
PHP中捕获超时事件的方法实例
2015/02/12 PHP
[原创]PHP实现逐行删除文件右侧空格的方法
2015/12/25 PHP
如何在centos8自定义目录安装php7.3
2019/11/28 PHP
响应鼠标变换表格背景或者颜色的代码
2009/03/30 Javascript
jQuery1.6 类型判断实现代码
2011/09/01 Javascript
JS Map 和 List 的简单实现代码
2013/07/08 Javascript
简单时间提示DEMO从0开始一直进行计时
2013/11/19 Javascript
js中判断用户输入的值是否为空的简单实例
2013/12/23 Javascript
js报$ is not a function 的问题的解决方法
2014/01/20 Javascript
JavaScript中统计Textarea字数并提示还能输入的字符
2014/06/10 Javascript
jQuery实现跨域iframe接口方法调用
2015/03/14 Javascript
jQuery时间轴插件使用详解
2015/07/16 Javascript
jquery基础知识第一讲之认识jquery
2016/03/17 Javascript
javascript将json格式数组下载为excel表格的方法
2017/12/22 Javascript
nodejs爬虫初试superagent和cheerio
2018/03/05 NodeJs
详解Vue结合后台的列表增删改案例
2018/08/21 Javascript
浅谈微信页面入口文件被缓存解决方案
2018/09/29 Javascript
微信小程序左滑删除功能开发案例详解
2018/11/12 Javascript
VUE DEMO之模拟登录个人中心页面之间数据传值实例
2019/10/31 Javascript
JS实现购物车基本功能
2020/11/08 Javascript
python访问系统环境变量的方法
2015/04/29 Python
python实现搜索本地文件信息写入文件的方法
2016/02/22 Python
Python numpy生成矩阵、串联矩阵代码分享
2017/12/04 Python
Python Paramiko模块的使用实际案例
2018/02/01 Python
python 通过xml获取测试节点和属性的实例
2018/03/31 Python
不到20行代码用Python做一个智能聊天机器人
2019/04/19 Python
python字符串中匹配数字的正则表达式
2019/07/03 Python
python用quad、dblquad实现一维二维积分的实例详解
2019/11/20 Python
使用pytorch搭建AlexNet操作(微调预训练模型及手动搭建)
2020/01/18 Python
CSS3中的clip-path使用攻略
2015/08/03 HTML / CSS
质检员岗位职责
2013/12/17 职场文书
大学生军训感想
2014/02/16 职场文书
签约仪式策划方案
2014/06/02 职场文书
领导干部对照检查材料
2014/08/24 职场文书
挂职个人工作总结
2015/03/05 职场文书