javascript事件监听,事件冒泡/捕获总结

本文详细介绍了JavaScript中事件监听的三种方法,包括不同浏览器的兼容性问题,以及事件捕获与事件冒泡的概念。通过具体示例展示了如何使用addEventListener实现事件的捕获和冒泡。

一、javascript事件监听的三种方法

[html]  view plain  copy
  1. element.addEventListener(type, listener[, useCapture]); // IE6~8不支持  
  2. element.attachEvent('on' + type, listener); // IE6~10支持, IE11不支持  
  3. element.'on' + type = function(){} // 所有浏览器  

以click 点击事件为例:

[html]  view plain  copy
  1. <!DOCTYPE HTML>  
  2. <html lang="zh-cn">  
  3. <head>  
  4. <meta charset="utf-8" />  
  5. <title>Javascript</title>  
  6. <style>  
  7. *{margin: 0;padding: 0;}  
  8. #big{width: 300px;height: 180px;background-color: orange;margin: 20px auto;}  
  9. #small{width: 150px;height: 100px;background-color: blue;}  
  10. </style>  
  11.   
  12. </head>  
  13. <body>  
  14. <div id="big">  
  15.     <div id="small"></div>  
  16. </div>  
  17.   
  18. <script>  
  19. window.onload = function(){  
  20.     var oSmall = document.getElementById('small');  
  21.     var oBig = document.getElementById('big');  
  22.   
  23.     //第一种:所有浏览器支持  
  24.     oBig.onclick = function(){  
  25.         console.log('Big Div');  
  26.     }  
  27.     //第二种:ie8及ie8以下不支持  
  28.     oBig.addEventListener('click', function(){  
  29.         console.log('Big Div');  
  30.     }, true);  
  31.   
  32.     //第三种:ie6~ie10支持  
  33.     oBig.attachEvent('onclick', function(){  
  34.         console.log('Big Div');  
  35.     });  
  36. }  
  37. </script>  
  38. </body>  
  39. </html>  

二、事件捕获与事件冒泡

关于事件的捕获与冒泡,引用一段文字来说明:

很久以前有个叫Netscape的姑娘,她制订了JavaScript的一套事件驱动机制(即事件捕获)

后来又有一个叫“IE”的小子,这孩子比较傲气,他认为“凭什么我要依照你的规则走”,于是他又创造了一套自己的规则(事件冒泡)


再后来,有个叫W3C的媒婆,想撮合这两个孩子,将他们的特点融合在了一起,这下,事件产生的顺序变成:

事件从根节点开始,逐级派送到子节点,若节点绑定了事件动作,则执行动作,然后继续走,这个阶段称为“捕获阶段(Capture)”;

执行完捕获阶段后,事件由子节点往根节点派送,若节点绑定了事件动作,则执行动作,然后继续走,这个阶段称为“冒泡阶段(Bubble)”。


善良的Netscape以及其姐妹们都接受了媒婆的建议,采用了新的事件规则,而骄傲固执的IE小子始终按照自己的规则执行。最终使得这成为困扰前端开发人员的兼容性问题之一。

几个要点:

(1)通过 element.onclick、element.attackEvent('onclick', function(){}) 来监听事件,均为冒泡机制。例子:

[html]  view plain  copy
  1. <!DOCTYPE HTML>  
  2. <html lang="zh-cn">  
  3. <head>  
  4. <meta charset="utf-8" />  
  5. <title>Javascript</title>  
  6. <style>  
  7. *{margin: 0;padding: 0;}  
  8. #big{width: 300px;height: 180px;background-color: orange;margin: 20px auto;}  
  9. #small{width: 150px;height: 100px;background-color: blue;}  
  10. </style>  
  11. </head>  
  12. <body>  
  13. <div id="big">  
  14.     <div id="small"></div>  
  15. </div>  
  16.   
  17. <script>  
  18. window.onload = function(){  
  19.     var oSmall = document.getElementById('small');  
  20.     var oBig = document.getElementById('big');  
  21.   
  22.     oBig.onclick = function(){  
  23.         console.log('Big Div');  
  24.     }  
  25.     oSmall.onclick = function(){  
  26.         console.log('Small Div');  
  27.     }  
  28.     // 当点击 div#small时,先后输出:  
  29.     // Small Div  
  30.     // Big Div  
  31. }  
  32. </script>  
  33. </body>  
  34. </html>  


(2)w3c 标准中的 addEventListener 方法

W3C规范中定义了3个事件阶段,依次是捕获阶段、目标阶段、冒泡阶段(即上文引用文字中的蓝色字体部分)。addEventListener 中的第三个参数 true/false,规定了该事件在捕获阶段执行,还是在冒泡阶段执行。

实例说明:

[html]  view plain  copy
  1. <!DOCTYPE HTML>  
  2. <html lang="zh-cn">  
  3. <head>  
  4. <meta charset="utf-8" />  
  5. <title>Javascript</title>  
  6. <style>  
  7. *{margin: 0;padding: 0;}  
  8. #big{width: 300px;height: 180px;background-color: orange;margin: 20px auto;}  
  9. #small{width: 150px;height: 100px;background-color: blue;}  
  10. </style>  
  11. </head>  
  12. <body>  
  13. <div id="big">  
  14.     <div id="small"></div>  
  15. </div>  
  16. <script>  
  17. window.onload = function(){  
  18.     var oSmall = document.getElementById('small');  
  19.     var oBig = document.getElementById('big');  
  20.   
  21.     oSmall.addEventListener('click', function(){  
  22.         console.log('Small Div 捕获');  
  23.     }, true);  
  24.     oBig.addEventListener('click', function(){  
  25.         console.log('Big Div 冒泡');  
  26.     });  
  27.     oBig.addEventListener('click', function(){  
  28.         console.log('Big Div 捕获');  
  29.     }, true);  
  30.     document.addEventListener('click', function(){  
  31.         console.log('Document 冒泡');  
  32.     });  
  33.     document.addEventListener('click', function(){  
  34.         console.log('Document 捕获');  
  35.     }, true);  
  36. }  
  37. </script>  
  38. </body>  
  39. </html>  
输出顺序如下图所示:


当我们点击 div#small 元素时,它是这样的过程:

第一阶段 —— 捕获阶段:所以,"Document 捕获" 最先被执行,然后是“Big Div 捕获”,最后是“Small Div 捕获”;

第二阶段 —— 目标阶段:到达 div#small 元素,然后,下一步,进入到冒泡阶段;

第三阶段 —— 冒泡阶段:Small Div 没有事件冒泡,所以,冒泡到 Big Div,发现有事件冒泡,输出“Big Div 冒泡”, 再继续往上冒泡,最后输出“Document 冒泡”。整个过程结束。

三、事件监听在不同浏览器下兼容写法


+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

文字引用:

http://www.cnblogs.com/aji88/archive/2012/07/20/2600492.html

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值