JavaScript事件捕获与事件冒泡原理
2011-07-04 11:32
531 查看
原文地址:http://blog.sina.com.cn/s/blog_6c07dac30100lkw8.html
支持W3C标准的浏览器在添加事件时用addEventListener(event,fn,useCapture)方法,基中第3个参数useCapture是一个Boolean值,用来设置事件是在事件捕获时执行,还是事件冒泡时执行。而不兼容W3C的浏览器(IE)用attachEvent()方法,此方法没有相关设置,不过IE的事件模型默认是在事件冒泡时执行的,也就是在useCapture等于false的时候执行,所以把在处理事件时把useCapture设置为false是比较安全,也实现兼容浏览器的效果。
看下图:
事件捕获阶段:事件从最上一级标签开始往下查找,直到捕获到事件目标(target)。事件冒泡阶段:事件从事件目标(target)开始,往上冒泡直到页面的最上一级标签。
通过一个例子可以很好的理解这种原理html:<ul id="news"> <li> <h3><a href="news.php?item=1">Title 1</a></h3> <p>Description 1</p> <p class="more"><a href="news.php?item=1">link 1</a></p> </li></ul>JavaScript:<script type="text/javascript">bubbleTest={ init:function(){ if(!document.getElementByIdx_x_x || !document.create_r_rTextNode){return;} bubbleTest.n=document.getElementByIdx_x_x('news'); if(!bubbleTest.n){return;} bubbleTest.addMyListeners('click',bubbleTest.liTest,'li'); bubbleTest.addMyListeners('click',bubbleTest.aTest,'a'); bubbleTest.addMyListeners('click',bubbleTest.pTest,'p'); }, addMyListeners:function(eventName,functionName,elements){ var temp=bubbleTest.n.getElementsByTagName_r(elements); for(var i=0;i<temp.length;i++){ temp[i].addEventListener(eventName,functionName,true); } }, liTest:function(e){ alert('li was clicked'); }, pTest:function(e){ alert('p was clicked'); }, aTest:function (e){ alert('a was clicked'); }}window.addEventListener('load',bubbleTest.init,false);</script> 如果给useCapture设置为true,点击link 1时会依次弹出:temp[i].addEventListener(eventName,functionName,true);第1次: li was clicked第2次: p was clicked第3次: a was clicked
如果给useCapture设置为false,点击link 1时会依次弹出:temp[i].addEventListener(eventName,functionName,false);第1次: a was clicked第2次: p was clicked第3次: li was clicked
结果正好相反,由此例可以看出事件捕获与事件冒泡实际效果。
支持W3C标准的浏览器在添加事件时用addEventListener(event,fn,useCapture)方法,基中第3个参数useCapture是一个Boolean值,用来设置事件是在事件捕获时执行,还是事件冒泡时执行。而不兼容W3C的浏览器(IE)用attachEvent()方法,此方法没有相关设置,不过IE的事件模型默认是在事件冒泡时执行的,也就是在useCapture等于false的时候执行,所以把在处理事件时把useCapture设置为false是比较安全,也实现兼容浏览器的效果。
看下图:
事件捕获阶段:事件从最上一级标签开始往下查找,直到捕获到事件目标(target)。事件冒泡阶段:事件从事件目标(target)开始,往上冒泡直到页面的最上一级标签。
通过一个例子可以很好的理解这种原理html:<ul id="news"> <li> <h3><a href="news.php?item=1">Title 1</a></h3> <p>Description 1</p> <p class="more"><a href="news.php?item=1">link 1</a></p> </li></ul>JavaScript:<script type="text/javascript">bubbleTest={ init:function(){ if(!document.getElementByIdx_x_x || !document.create_r_rTextNode){return;} bubbleTest.n=document.getElementByIdx_x_x('news'); if(!bubbleTest.n){return;} bubbleTest.addMyListeners('click',bubbleTest.liTest,'li'); bubbleTest.addMyListeners('click',bubbleTest.aTest,'a'); bubbleTest.addMyListeners('click',bubbleTest.pTest,'p'); }, addMyListeners:function(eventName,functionName,elements){ var temp=bubbleTest.n.getElementsByTagName_r(elements); for(var i=0;i<temp.length;i++){ temp[i].addEventListener(eventName,functionName,true); } }, liTest:function(e){ alert('li was clicked'); }, pTest:function(e){ alert('p was clicked'); }, aTest:function (e){ alert('a was clicked'); }}window.addEventListener('load',bubbleTest.init,false);</script> 如果给useCapture设置为true,点击link 1时会依次弹出:temp[i].addEventListener(eventName,functionName,true);第1次: li was clicked第2次: p was clicked第3次: a was clicked
如果给useCapture设置为false,点击link 1时会依次弹出:temp[i].addEventListener(eventName,functionName,false);第1次: a was clicked第2次: p was clicked第3次: li was clicked
结果正好相反,由此例可以看出事件捕获与事件冒泡实际效果。
相关文章推荐
- JavaScript事件捕获与事件冒泡原理 IE和DOM之间存在哪些主要差别
- javascript事件冒泡与事件捕获
- javascript 冒泡与捕获的原理及操作实例
- JavaScript之事件的处理模型---事件冒泡,捕获及取消冒泡,阻止默认事件
- javascript事件冒泡、捕获及阻止方法终极解答
- JavaScript事件流之事件冒泡,事件捕获
- javascript 中事件冒泡和事件捕获机制的详解
- javascript事件冒泡与捕获
- JavaScript的事件监听与捕获和冒泡
- javascript事件之: 事件冒泡, 事件捕获 ,阻止默认事件
- javascript事件冒泡与事件捕获
- 看懂此文,不再困惑于javascript中的事件绑定、事件冒泡、事件捕获和事件执行顺序
- javascript事件处理方式之捕获冒泡
- javascript 冒泡与捕获的原理及操作实例
- javascript dom 事件冒泡与捕获
- javascript的事件冒泡和事件捕获
- javascript事件之: 事件冒泡, 事件捕获 ,阻止默认事件
- JavaScript 详说事件机制之冒泡、捕获、传播、委托
- 事件冒泡,捕获原理
- javascript事件处理机制---事件监听、捕获和冒泡