JavaScript事件监听机制

た 入场券 2022-08-18 11:57 352阅读 0赞

初学JavaScript时,会用这样的方法监听事件

  1. <html>
  2. <head>
  3. <meta charset="utf-8">
  4. <title>js事件监听机制</title>
  5. </head>
  6. <body>
  7. <input type="button" value="click me!" id="btn-1">
  8. <script type="text/javascript">
  9. btn1 = document.getElementById("btn-1");
  10. btn1.onclick = function(){
  11. alert("第一次点击按钮");
  12. }
  13. btn1.onclick = function(){
  14. alert("第二次点击按钮");
  15. }
  16. </script>
  17. </body>
  18. </html>

然而和想象中的结果并不相同,当点击按钮时,弹出窗口这样显示

Center

这是因为当同一个对象用.onclick触发多个写法时,后面的方法会把前面的覆盖掉,当事件发生时,只会执行最后的绑定方法,在上面的例子中,后面的方法把前面的覆盖了,所以只出现了一个窗口。

对于这种现象,我们可以用以下的方式来解决

1.addEventListener

语法

target.addEventListener(type, listener, useCapture);

target:文档节点

type:事件名称,不含on,例如click,keydown

listener:调用的函数

useCapture:是否绑定在捕获阶段,默认为falsel

示例代码

  1. <html>
  2. <head>
  3. <meta charset="utf-8">
  4. <title>js事件监听机制</title>
  5. </head>
  6. <body>
  7. <input type="button" value="click me!" id="btn-1">
  8. <script type="text/javascript">
  9. function eventFirst(){
  10. alert("第一次点击按钮");
  11. }
  12. function eventSecond(){
  13. alert("第二次点击按钮");
  14. }
  15. window.onload = function(){
  16. btn1 = document.getElementById("btn-1");
  17. btn1.addEventListener("click", eventFirst);
  18. btn1.addEventListener("click", eventSecond);
  19. }
  20. </script>
  21. </body>
  22. </html>

当点击按钮时,出现如下情况

Center 1

点击确定

Center 2

依次输出第一个监听事件和第二个监听事件

解除事件绑定

  1. <span style="font-size:18px;">btn1.removeEventListener("click", eventFirst);</span>

这样就解除了第一个监听事件的绑定

当点击按钮时,只输出第二个监听事件

注意:解除事件绑定时一定要用函数的句柄,否则解绑无效

2.attachEvent

IE浏览器使用attachEvent来绑定事件

语法

target.attachEvent(type, listener);

target:文档节点

type:事件名称,带on,比如onclick,onkeydown等等

listener:调用的函数

3.兼容各大主流浏览器的写法

通过以上的实验,最终对函数进行封装

代码如下

  1. <html>
  2. <head>
  3. <meta charset="utf-8">
  4. <title>js事件监听机制</title>
  5. <style type="text/css">
  6. #box{
  7. height:100px;
  8. width:100px;
  9. background-color:red;
  10. }
  11. </style>
  12. </head>
  13. <body>
  14. <div id="box">
  15. <input type="button" value="click me!" id="btn-1">
  16. </div>
  17. <script type="text/javascript">
  18. //监听元素事件函数
  19. function addEventHandler(target, type, func){
  20. if(target.addEventListener){
  21. //兼容IE9,Firefox以及Chrome
  22. target.addEventListener(type, func, false);
  23. }else if(target.attachEvent){
  24. //版本较低的IE浏览器
  25. target.attachEvent("on" + type, func);
  26. }else{
  27. target["on" + type] = func;
  28. }
  29. }
  30. //解除事件监听
  31. function removeEventHandler(target, type, func){
  32. if(target.removeEventListener){
  33. target.removeEventListener(type, func, false);
  34. }else if(target.detachEvent){
  35. target.detachEvent("on" + type, func);
  36. }else{
  37. delete target["on" + type];
  38. }
  39. }
  40. function eventFirst(){
  41. alert("点击按钮");
  42. }
  43. function eventSecond(){
  44. alert("点击div");
  45. }
  46. window.onload = function(){
  47. btn1 = document.getElementById("btn-1");
  48. box1 = document.getElementById("box");
  49. //给按钮添加监听事件
  50. addEventHandler(btn1, "click", eventFirst);
  51. //给div添加监听事件
  52. addEventHandler(box, "click", eventSecond);
  53. //解除div的监听事件
  54. removeEventHandler(box, "click", eventSecond);
  55. }
  56. </script>
  57. </body>
  58. </html>

发表评论

表情:
评论列表 (有 0 条评论,352人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Spring事件监听机制

    前言 Spring中的事件机制其实就是设计模式中的观察者模式,主要由以下角色构成: 1. 事件 2. 事件监听器(监听并处理事件) 3. 事件发布者(发布事件...

    相关 事件监听机制

    ![这里写图片描述][20160420164724788]   Java中的事件监听是整个Java消息传递的基础和关键。牵涉到三类对象:事件源(Event S