事件冒泡和捕获通俗理解

作者: 赵永盛 | 来源:发表于2018-09-15 21:25 被阅读21次
    
    <body>
        <div id="s1">s1 
            <div id="s2">s2</div> 
        </div>
    </body>
    
    <script>
    s1.addEventListener("click",function(e){
            console.log("s1 冒泡事件");         
    },false);
    s2.addEventListener("click",function(e){
            console.log("s2 冒泡事件"); 
    },false);
           
    s1.addEventListener("click",function(e){
            console.log("s1 捕获事件"); 
    },true);
           
    s2.addEventListener("click",function(e){
            console.log("s2 捕获事件"); 
    },true);
    </script>
    
    

    addEventListener 第三个参数:
    true: 捕获阶段触发事件
    false: 冒泡阶段触发事件
    默认值是 false, 也就是默认是冒泡阶段触发事件的。当然可以手动添加捕获事件,这样冒泡和捕获就同时存在了。

    1005354-20161222125521823-1914047378.png

    由上图看出,先捕获后冒泡

    首先理解事件的起始和终止发生时间:
    当我们点击 div, 时间捕获从window 一直传递到当前 div 就终止,不会往下走;然后进入冒泡阶段,向上层传递,再一直到 window 终止。

    我们知道,对于不同dom 节点的事件传播,是先捕获后冒泡,那么对于 dom 目标节点,如果同时存在冒泡和捕获,又是什么情况呢?还是遵循上述规则吗?

    不妨对文章开头的例子进行实验:
    发现 s2 的冒泡发生在 s2 捕获之前
    这里注意:
    对于事件的目标节点,如果同时存在冒泡和捕获,那么事件的执行顺序和代码中事件绑定的顺序相同

    上述示例的答案:
    点击 s1:

    s1 冒泡事件
    s1 捕获事件
    

    点击 s2:

    s1 捕获事件
    s2 冒泡事件
    s2 捕获事件
    s1 冒泡事件
    

    相关文章

      网友评论

        本文标题:事件冒泡和捕获通俗理解

        本文链接:https://www.haomeiwen.com/subject/onitnftx.html