事件冒泡,捕获,阻止行为

Posted 汤姆猫8

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了事件冒泡,捕获,阻止行为相关的知识,希望对你有一定的参考价值。

一、事件的发生顺序

这个问题的起源非常简单,假设你在一个元素中又嵌套了另一个元素
复制代码 代码如下:

-----------------------------------
| element1                        |
|   -------------------------     |
|   |element2               |     |
|   -------------------------     |

-----------------------------------

:并且两者都有一个onClick事件处理函数(event handler)。如果用户单击元素2,则元素1和元素2的单击事件都会被触发。但是哪一个事件先被触发?哪一个事件处理函数会被首先执行?换句话说,事件的发生顺序到底如何?

个人实践理解:

一般情况下,点击element2之后,会先进行捕获,也就是

①从外到element2元素一路激活捕获事件,

②然后从内到外激活冒泡事件。


 


 

默认情况下事件属于——冒泡事件,例如:

 var btn1 = document.getElementById(\'btn1\'); 
btn1.onclick = function(){
              alert(\'123\');
          }

 


 

可以通过这种方法去规定捕获事件和冒泡事件:(规定这种事件的作用——可以指定事件发生的先后顺序

var btn = document.getElementById(\'btn\'); 
var box = document.getElementById(\'box\'); 
 //true——捕获; false——冒泡
            btn.addEventListener(\'click\',doSomething2,false)
            document.addEventListener(\'click\',doSomething,true)
//先进行捕获阶段,然后进行冒泡。
//单击btn按钮后,先doSomething然后doSomething2


若要做到阻止冒泡行为的发生,需要用到——window.event.cancelBubble = true; 

实践案例:

 

<!DOCTYPE html> 
<html> 
  
  <head> 
    <meta charset="UTF-8"> 
    <title></title> 
    <style type="text/css"> 
      #box { 
        width: 300px; 
        height: 300px; 
        background: red; 
        display: none; 
      } 
    </style> 
    <script type="text/javascript"> 
      window.onload = function() { 
          var btn = document.getElementById(\'btn\'); 
          var box = document.getElementById(\'box\'); 
          var btn1 = document.getElementById(\'btn1\'); 
          //true——捕获; false——冒泡
            btn.addEventListener(\'click\',doSomething2,false)
            document.addEventListener(\'click\',doSomething,false)
            /*
             btn.addEventListener(\'click\',doSomething2,false)
            document.addEventListener(\'click\',doSomething,true)
            先进行捕获阶段,然后进行冒泡。先doSomething然后doSomething2
            */
          btn1.onclick = function(){
              alert(\'123\');
          }
         function doSomething2(ev) {
            console.log(ev); 
            console.log(event); 
            var oEvent = ev || event; 
            console.log(oEvent);
            box.style.display = \'block\'; 
            //oEvent.cancelBubble = true;//高版本浏览器 
            stopBubble(oEvent); //调用阻止冒泡方法
            //在低版本的chrome和firefox浏览器中需要兼容性处理 
            //高版本chrome和firefox浏览器直接使用上面这行代码即可 
          } 
         function doSomething() { 
            box.style.display = \'none\'; 
            alert(\'document\');
          } 
  
        } 
        //阻止冒泡事件的兼容性处理 
      function stopBubble(e) { 
        if(e && e.stopPropagation) { //非IE 
          e.stopPropagation(); 
        } else { //IE 
          window.event.cancelBubble = true; 
        } 
      } 
    </script> 
  </head> 
  
  <body> 
    <input type="button" id="btn" value="语言" /> 
    <input type="button" id="btn1" value="语言1" /> 
    <div id="box"></div> 
  </body> 
  
</html>

 

以上是关于事件冒泡,捕获,阻止行为的主要内容,如果未能解决你的问题,请参考以下文章

JS阻止冒泡和取消默认事件(默认行为)

js 阻止冒泡 阻止默认事件

javascript阻止事件冒泡和浏览器的默认行为

javascript阻止事件冒泡和浏览器的默认行为

js中阻止事件冒泡和浏览器默认行为

js中啥是事件气泡,如何阻止事件气泡