冒泡和捕获小结

通常我们只考虑一个dom绑定一种事件类型。(碰到一个问题。一个dom分别绑定了冒泡和捕获类型的事件)在一个dom元素同时绑定冒泡和捕获的该怎么处理。

我们来看一下的问题。下面事件的触发顺序是如何的

<body>
    <div class="warpper">
        <div class="context">点我</div>
    </div>
    <script>
        var divw=document.getElementsByClassName('warpper')[0];
        var divc=document.getElementsByClassName('context')[0];
        divw.addEventListener('click',function(){
            console.log('D')
        });
        divc.addEventListener('click',function(){
            console.log('C')
        })
        divc.addEventListener('click',function(){
            console.log('A')
        },true);
        divw.addEventListener('click',function(){
            console.log('B')
        })
        //结果为CADB
        
    </script>
</body>

通过分析:

父级事件没有捕获事件,所以不会优先触发。

当一个子级事件同时有冒泡和捕获的时候(按代码顺序执行)

当子级为捕获,父级为冒泡的时候同样也可以触发父级事件(顺序为子到父)

不难看出以上题的答案是 CADB(由子级触发到父级)

<body>
    <div class="warpper">
        <div class="context">点我</div>
    </div>
    <script>
        var divw=document.getElementsByClassName('warpper')[0];
        var divc=document.getElementsByClassName('context')[0];
        divw.addEventListener('click',function(){
            console.log('D')
        });
        divc.addEventListener('click',function(){
            console.log('C')
        })
        // divc.addEventListener('click',function(){
        //     console.log('A')
        // },true);
        divw.addEventListener('click',function(){
            console.log('B')
        })

        //结果为CDB
        
    </script>
</body>
<body>
    <div class="warpper">
        <div class="context">点我</div>
    </div>
    <script>
        var divw=document.getElementsByClassName('warpper')[0];
        var divc=document.getElementsByClassName('context')[0];
        divw.addEventListener('click',function(){
            console.log('D')
        });
        // divc.addEventListener('click',function(){
        //     console.log('C')
        // })
        divc.addEventListener('click',function(){
            console.log('A')
        },true);
        divw.addEventListener('click',function(){
            console.log('B')
        })

        //结果为ADB
        
    </script>
</body>
<body>
    <div class="warpper">
        <div class="context">点我</div>
    </div>
    <script>
        var divw=document.getElementsByClassName('warpper')[0];
        var divc=document.getElementsByClassName('context')[0];
        // divw.addEventListener('click',function(){
        //     console.log('D')
        // });
        divc.addEventListener('click',function(){
            console.log('C')
        })
        divc.addEventListener('click',function(){
            console.log('A')
        },true);
        // divw.addEventListener('click',function(){
        //     console.log('B')
        // })

        //结果为CA
        
    </script>
</body>

通过以上可以看出。事件都是按代码顺序执行的(切换代码顺序时候也一样,可以自己尝试)

当我们给父级事件冒泡改成捕获时候会优先触发:

<body>
    <div class="warpper">
        <div class="context">点我</div>
    </div>
    <script>
        var divw=document.getElementsByClassName('warpper')[0];
        var divc=document.getElementsByClassName('context')[0];
        divw.addEventListener('click',function(){
            console.log('D')
        });
        divc.addEventListener('click',function(){
            console.log('C')
        })
        divc.addEventListener('click',function(){
            console.log('A')
        },true);
        divw.addEventListener('click',function(){
            console.log('B')
        },true)

        //结果为BCAD
        
    </script>
</body>

小结:

子级的父级(或父级以上)有捕获类型事件优先触发。

都为冒泡(子级为捕获),则按点击的dom元素事件向上传递执行(还有代码的顺序)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值