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 相关文章推荐
jquery 快速回到页首的方法
Dec 05 Javascript
JavaScript实现简单的二级导航菜单实例
Apr 15 Javascript
Angular2学习笔记——详解路由器模型(Router)
Dec 02 Javascript
vue-dialog的弹出层组件
May 25 Javascript
jQuery选择器_动力节点Java学院整理
Jul 05 jQuery
angularjs实现分页和搜索功能
Jan 03 Javascript
js经验分享 JavaScript反调试技巧
Mar 10 Javascript
vue 根据数组中某一项的值进行排序的方法
Aug 30 Javascript
vue项目添加多页面配置的步骤详解
May 22 Javascript
原生JS与JQ获取元素的区别详解
Feb 13 Javascript
jQuery实现动态操作table行
Nov 23 jQuery
vue3使用vue-router的完整步骤记录
Jun 20 Vue.js
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获取当前文件所在目录 getcwd()函数
2009/05/13 PHP
供参考的 php 学习提高路线分享
2011/10/23 PHP
php curl中gzip的压缩性能测试实例分析
2016/11/08 PHP
Linux基于php-fpm模式的lamp搭建phpmyadmin的方法
2018/10/25 PHP
自己的js工具_Form 封装
2009/08/21 Javascript
jquery获取tr中控件值并操作tr实现思路
2013/03/27 Javascript
关于jQuery参考实例 1.0 jQuery的哲学
2013/04/07 Javascript
JS两种定义方式的区别、内部原理
2013/11/21 Javascript
node.js中的fs.realpath方法使用说明
2014/12/16 Javascript
浅谈document.write()输出样式
2015/05/07 Javascript
JavaScript实现的背景自动变色代码
2015/10/17 Javascript
详解AngularJS过滤器的使用
2016/03/11 Javascript
nginx配置React静态页面的方法教程
2017/11/03 Javascript
js 取消页面可以选中文字的功能方法
2018/01/02 Javascript
clipboard在vue中的使用的方法示例
2018/10/19 Javascript
JavaScript中构造函数与原型链之间的关系详解
2019/02/25 Javascript
[32:56]完美世界DOTA2联赛PWL S3 Rebirth vs CPG 第二场 12.11
2020/12/16 DOTA
python itchat给指定联系人发消息的方法
2019/06/11 Python
python实现列表中最大最小值输出的示例
2019/07/09 Python
django中间键重定向实例方法
2019/11/10 Python
如何使用selenium和requests组合实现登录页面
2020/02/03 Python
详解字符串在Python内部是如何省内存的
2020/02/03 Python
python 实现人和电脑猜拳的示例代码
2020/03/02 Python
Python如何转换字符串大小写
2020/06/04 Python
Django web自定义通用权限控制实现方法
2020/11/24 Python
如何用Lucene索引数据库
2016/02/23 面试题
JAVA中的关键字有什么特点
2014/03/07 面试题
一些Unix笔试题和面试题
2013/01/22 面试题
大学生心理活动总结
2014/07/04 职场文书
地质工程专业毕业生求职信
2014/08/08 职场文书
会计实训报告范文
2014/11/04 职场文书
求职推荐信范文
2015/03/27 职场文书
大学新生入学感想
2015/08/07 职场文书
Java实战之用Swing实现通讯录管理系统
2021/06/13 Java/Android
Python实现为PDF去除水印的示例代码
2022/04/03 Python
详解Go语言中配置文件使用与日志配置
2022/06/01 Golang