js事件监听器用法实例详解


Posted in Javascript onJune 01, 2015

本文实例讲述了js事件监听器用法。分享给大家供大家参考。具体分析如下:

1、当同一个对象使用.onclick的写法触发多个方法的时候,后一个方法会把前一个方法覆盖掉,也就是说,在对象的onclick事件发生时,只会执行最后绑定的方法。而用事件监听则不会有覆盖的现象,每个绑定的事件都会被执行。如下:

window.onload = function(){ 
 var btn = document.getElementById("yuanEvent"); 
 btn.onclick = function(){ 
  alert("第一个事件"); 
 } 
 btn.onclick = function(){ 
  alert("第二个事件"); 
 } 
 btn.onclick = function(){ 
  alert("第三个事件"); 
 } 
}

最后只输出:第三个事件,因为后一个方法都把前一个方法覆盖掉了。

原生态的事件绑定函数addEventListener:

var eventOne = function(){ 
 alert("第一个监听事件"); 
} 
function eventTwo(){ 
 alert("第二个监听事件"); 
} 
window.onload = function(){ 
 var btn = document.getElementById("yuanEvent"); 
 //addEventListener:绑定函数 
 btn.addEventListener("click",eventOne); 
 btn.addEventListener("click",eventTwo); 
}

输出:第一个监听事件 和 第二个监听事件

2、采用事件监听给对象绑定方法后,可以解除相应的绑定,写法如下:

var eventOne = function(){ 
 alert("第一个监听事件"); 
} 
function eventTwo(){ 
 alert("第二个监听事件"); 
} 
window.onload = function(){ 
 var btn = document.getElementById("yuanEvent"); 
 btn.addEventListener("click",eventOne); 
 btn.addEventListener("click",eventTwo); 
 btn.removeEventListener("click",eventOne); 
}

输出:第二个监听事件

3、解除绑定事件的时候一定要用函数的句柄,把整个函数写上是无法解除绑定的。

错误写法:

btn.addEventListener("click",function(){ 
 alert(11); 
}); 
btn.removeEventListener("click",function(){ 
 alert(11); 
});

正确写法:

btn.addEventListener("click",eventTwo); 
btn.removeEventListener("click",eventOne);

总结:对函数进行封装后的监听事件如下,兼容各大主流浏览器。

/* 
 * addEventListener:监听Dom元素的事件 
 * 
 * target:监听对象 
 * type:监听函数类型,如click,mouseover 
 * func:监听函数 
 */ 
function addEventHandler(target,type,func){ 
 if(target.addEventListener){ 
  //监听IE9,谷歌和火狐 
  target.addEventListener(type, func, false); 
 }else if(target.attachEvent){ 
  target.attachEvent("on" + type, func); 
 }else{ 
  target["on" + type] = func; 
 } 
} 
/* 
 * removeEventHandler:移除Dom元素的事件 
 * 
 * target:监听对象 
 * type:监听函数类型,如click,mouseover 
 * func:监听函数 
 */ 
function removeEventHandler(target, type, func) { 
 if (target.removeEventListener){ 
  //监听IE9,谷歌和火狐 
  target.removeEventListener(type, func, false); 
 } else if (target.detachEvent){ 
  target.detachEvent("on" + type, func); 
 }else { 
  delete target["on" + type]; 
 } 
} 
var eventOne = function(){ 
 alert("第一个监听事件"); 
} 
function eventTwo(){ 
 alert("第二个监听事件"); 
} 
window.onload = function(){ 
 var bindEventBtn = document.getElementById("bindEvent"); 
 //监听eventOne事件 
 addEventHandler(bindEventBtn,"click",eventOne); 
 //监听eventTwo事件 
 addEventHandler(bindEventBtn,"click",eventTwo ); 
 //监听本身的事件 
 addEventHandler(bindEventBtn,"click",function(){ 
  alert("第三个监听事件"); 
 }); 
 //取消第一个监听事件 
 removeEventHandler(bindEventBtn,"click",eventOne); 
 //取消第二个监听事件 
 removeEventHandler(bindEventBtn,"click",eventTwo); 
}

实例:

<!DOCTYPE html> 
<html> 
 <head> 
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
  <title>Event</title> 
  <script type="text/javascript"> 
   function addEventHandler(target,type,func){ 
    if(target.addEventListener){ 
     //监听IE9,谷歌和火狐 
     target.addEventListener(type, func, false); 
    }else if(target.attachEvent){ 
     target.attachEvent("on" + type, func); 
    }else{ 
     target["on" + type] = func; 
    } 
   } 
   function removeEventHandler(target, type, func) { 
    if (target.removeEventListener){ 
     //监听IE9,谷歌和火狐 
     target.removeEventListener(type, func, false); 
    } else if (target.detachEvent){ 
     target.detachEvent("on" + type, func); 
    }else { 
     delete target["on" + type]; 
    } 
   } 
   var eventOne = function(){ 
    alert("第一个监听事件"); 
   } 
   function eventTwo(){ 
    alert("第二个监听事件"); 
   } 
   window.onload = function(){ 
    var bindEventBtn = document.getElementById("bindEvent"); 
    //监听eventOne事件 
    addEventHandler(bindEventBtn,"click",eventOne); 
    //监听eventTwo事件 
    addEventHandler(bindEventBtn,"click",eventTwo ); 
    //监听本身的事件 
    addEventHandler(bindEventBtn,"click",function(){ 
     alert("第三个监听事件"); 
    }); 
    //取消第一个监听事件 
    removeEventHandler(bindEventBtn,"click",eventOne); 
    //取消第二个监听事件 
    removeEventHandler(bindEventBtn,"click",eventTwo); 
   } 
  </script> 
 </head> 
 <body> 
  <input type="button" value="测试" id="bindEvent"> 
  <input type="button" value="测试2" id="yuanEvent"> 
 </body> 
</html>

PS:这里再为大家提供一个关于JS事件的在线工具,归纳总结了JS常用的事件类型与相关函数功能:

javascript事件与功能说明大全:

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

Javascript 相关文章推荐
Javascript 闭包引起的IE内存泄露分析
May 23 Javascript
文本域中换行符的替换示例
Mar 04 Javascript
两个多选select(multiple左右)添加、删除选项和取值实例
May 12 Javascript
jQuery实现购物车数字加减效果
Mar 14 Javascript
PageSwitch插件实现100种不同图片切换效果
Jul 28 Javascript
jQuery toggle 代替方法
Mar 22 Javascript
JS 面向对象之继承---多种组合继承详解
Jul 10 Javascript
自定义require函数让浏览器按需加载Js文件
Nov 24 Javascript
手把手教你搭建ES6的开发运行环境
Jul 11 Javascript
vue-cli脚手架config目录下index.js配置文件的方法
Mar 13 Javascript
javaScript把其它类型转换为Number类型
Oct 13 Javascript
JS实现无限轮播无倒退效果
Sep 21 Javascript
JavaScript中isPrototypeOf函数作用和使用实例
Jun 01 #Javascript
JS实现屏蔽shift,Ctrl,alt等功能键的方法
Jun 01 #Javascript
JavaScript使用addEventListener添加事件监听用法实例
Jun 01 #Javascript
JavaScript使用位运算符判断奇数和偶数的方法
Jun 01 #Javascript
JavaScript实现把rgb颜色转换成16进制颜色的方法
Jun 01 #Javascript
JavaScript实现的简单拖拽效果
Jun 01 #Javascript
一看就懂:jsonp详解
Jun 01 #Javascript
You might like
php的array数组和使用实例简明教程(容易理解)
2014/03/20 PHP
Yii Framework框架获取分类下面的所有子类方法
2014/06/20 PHP
Yii中CGridView禁止列排序的设置方法
2016/07/12 PHP
浅谈laravel-admin的sortable和orderby使用问题
2019/10/03 PHP
jQuery ctrl+Enter shift+Enter实现代码
2010/02/07 Javascript
用Javascript实现Windows任务管理器的代码
2012/03/27 Javascript
jQuery语法总结和注意事项小结
2012/11/11 Javascript
基于jquery实现的文字淡入淡出效果
2013/11/14 Javascript
jQuery基于当前元素进行下一步的遍历
2014/05/20 Javascript
js实现登录验证码
2016/12/22 Javascript
详解React-Native全球化多语言切换工具库react-native-i18n
2017/11/03 Javascript
vue调试工具vue-devtools安装及使用方法
2018/11/07 Javascript
微信小程序实现跳转的几种方式总结(推荐)
2019/04/24 Javascript
js实现多张图片每隔一秒切换一张图片
2019/07/29 Javascript
js实现随机抽奖
2020/03/19 Javascript
Vue使用自定义指令实现拖拽行为实例分析
2020/06/06 Javascript
[01:20]DOTA2上海特级锦标赛现场采访:谁的ID最受青睐
2016/03/25 DOTA
python 实现堆排序算法代码
2012/06/05 Python
Python第三方库的安装方法总结
2016/06/06 Python
Python实现的手机号归属地相关信息查询功能示例
2017/06/08 Python
Python实现PS图像明亮度调整效果示例
2018/01/23 Python
Django学习之文件上传与下载
2019/10/06 Python
简单了解python中的f.b.u.r函数
2019/11/02 Python
python传到前端的数据,双引号被转义的问题
2020/04/03 Python
详解查看Python解释器路径的两种方式
2020/10/15 Python
基于Python实现全自动下载抖音视频
2020/11/06 Python
内业资料员岗位职责
2014/01/04 职场文书
四年大学自我鉴定
2014/02/17 职场文书
销售人才自我评价范文
2014/09/27 职场文书
群众路线领导班子整改方案
2014/10/25 职场文书
综治工作汇报材料
2014/10/27 职场文书
超市工作总结范文2014
2014/12/19 职场文书
毕业论文致谢词
2015/05/14 职场文书
创新创业项目计划书该怎样写?
2019/08/13 职场文书
muduo TcpServer模块源码分析
2022/04/26 Redis
JS前端可扩展的低代码UI框架Sunmao使用详解
2022/07/23 Javascript