解析:浏览器事件冒泡及事件捕获
2014-03-03 16:48
316 查看
今天的效率有点奇葩,说高吧,一个上午做了不少事。说低吧,因为一个分布式的算法花了我不少时间,终于有点头绪。估计明天会写一篇文章来讲述一下自己的看法。
而今天,还是回到前端。今天来说说事件冒泡和事件捕获。首先肯定是概念:什么是事件冒泡?什么是事件捕获?
简单地说,事件冒泡和事件捕获都是一种事件传递的机制。这种机制可以使事件在不同级的元素间传递。事件冒泡是从事件触发的源节点,向父节点传递,直到到达最顶节点。而事件捕获则是从最顶节点,逐步向下传递,直到到达事件触发的源节点。
在一些标准的浏览器中,如Chrome、Firefox等,支持这两种冒泡方式。而事实上,准确的说,是这两种方式的混合方式。因为W3C采取的就是这两种方式的结合:先从顶级节点开始,将事件向下传递至源节点,再从源节点冒泡至顶节点。
而在IE及Opera(以下说的都是老版本的欧朋,新版本的欧朋经检测是支持事件捕获的)下,是不支持事件捕获的。而这个特点最明显体现在事件绑定函数上。
IE、Opera的事件绑定函数是attachEvent,而Chrome等浏览器则是addEventListener,而后者比前者的参数多了一个——这个参数是一个布尔值,这个布尔值由用户决定,用户若设为true,则该绑定事件以事件捕获的形式参与,若为false则以事件冒泡的形势参与。而这个参数在IE和Opera浏览器中是不存在的——根本原因是它们不支持事件捕获。
下面我来提供一个例子让大家更好地理解事件冒泡和事件捕获(本来想用flex布局,后来想偷懒,所以还是算了,大家不要注意细节(*^__^*) 嘻嘻……):
可以留意到,我在例子中还增加了一个preventDefault的例子,因为我看到网上许多文章都把它和stopPropagation放在一起讨论,所以这里也让大家了解一下。
而今天,还是回到前端。今天来说说事件冒泡和事件捕获。首先肯定是概念:什么是事件冒泡?什么是事件捕获?
简单地说,事件冒泡和事件捕获都是一种事件传递的机制。这种机制可以使事件在不同级的元素间传递。事件冒泡是从事件触发的源节点,向父节点传递,直到到达最顶节点。而事件捕获则是从最顶节点,逐步向下传递,直到到达事件触发的源节点。
在一些标准的浏览器中,如Chrome、Firefox等,支持这两种冒泡方式。而事实上,准确的说,是这两种方式的混合方式。因为W3C采取的就是这两种方式的结合:先从顶级节点开始,将事件向下传递至源节点,再从源节点冒泡至顶节点。
而在IE及Opera(以下说的都是老版本的欧朋,新版本的欧朋经检测是支持事件捕获的)下,是不支持事件捕获的。而这个特点最明显体现在事件绑定函数上。
IE、Opera的事件绑定函数是attachEvent,而Chrome等浏览器则是addEventListener,而后者比前者的参数多了一个——这个参数是一个布尔值,这个布尔值由用户决定,用户若设为true,则该绑定事件以事件捕获的形式参与,若为false则以事件冒泡的形势参与。而这个参数在IE和Opera浏览器中是不存在的——根本原因是它们不支持事件捕获。
下面我来提供一个例子让大家更好地理解事件冒泡和事件捕获(本来想用flex布局,后来想偷懒,所以还是算了,大家不要注意细节(*^__^*) 嘻嘻……):
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> <style> div { margin: 0 auto; } #ele1 { width: 500px; height: 500px; background: green; line-height: 500px; text-align: center; } #ele2 { width: 300px; height: 300px; line-height: 300px; background: blue; text-align: center; display: inline-block; vertical-align: middle; } #ele3 { width: 200px; height: 200px; background: red; display: inline-block; vertical-align: middle; } </style> </head> <body> <div id="ele1"> <div id="ele2"> <div id="ele3"></div> </div> </div> <a id="test" href="http://baidu.com/">click</a> <script type="text/javascript"> window.onload = function() { var e1 = document.getElementById('ele1'); var e2 = document.getElementById('ele2'); var e3 = document.getElementById('ele3'); var link = document.getElementById('test'); e1.addEventListener('click',function(evt) { console.log('ele1-click'); },true); e2.addEventListener('click',function(evt) { console.log('ele2-click'); }); e3.addEventListener('click',function(evt) { console.log('ele3-click'); evt.stopPropagation(); }); link.addEventListener('click',function(evt) { console.log('^_^,I have stopped it!') evt.preventDefault(); }); }; </script> </body> </html>
可以留意到,我在例子中还增加了一个preventDefault的例子,因为我看到网上许多文章都把它和stopPropagation放在一起讨论,所以这里也让大家了解一下。
相关文章推荐
- 浏览器中的事件捕获和冒泡
- 前端之浏览器事件冒泡和事件捕获
- js事件捕获和冒泡解析
- 01期:web浏览器事件传播机制(捕获和冒泡)
- 用伪代码理解浏览器中的事件冒泡以及捕获
- 浏览器的事件捕获阶段和冒泡阶段笔记
- 一个形象展示浏览器事件冒泡与捕获过程的demo
- javascript事件处理机制---事件监听、捕获和冒泡
- js阻止浏览器的默认行为以及停止事件冒泡(用JQuery实现回车提交)
- 阻止浏览器冒泡事件,兼容firefox和ie
- 捕获键盘事件(兼容各浏览器)
- 了解事件冒泡和事件捕获
- DOM事件阶段以及事件捕获与事件冒泡先后执行顺序
- js 停止事件冒泡 阻止浏览器的默认行为(阻止超连接 # )
- 事件捕获(capture)和冒泡事件(Bubble)
- Flex中捕获浏览器的前进、后退、刷新、关闭事件
- JavaScript高级程序设计笔记 事件冒泡和事件捕获
- JS阻止事件冒泡兼容各浏览器
- js之事件冒泡和事件捕获详细介绍
- 【jQuery】jQuery中的事件捕获与事件冒泡