js事件流

事件流一共由三个阶段分别是:
1.捕获阶段
2.目标阶段
3.冒泡阶段

事件绑定大家都知道,有DOM0级(on+事件类型)和DOM2级(addEventListener)

DOM0级

<div id="box1"></div>
box1.onclick = function(){
	console.log('box1');
}

输出了box1。再来看下面代码

<div id="box1"></div>
box1.onclick = function(){
	console.log('box1');
}
box1.onclick = function(){
	console.log('box1 two');
}

输出了box1 two,因为DOM0级会覆盖掉之前在同一元素上面的绑定,再来看一下。

    <div id="box1">
        <div id="box2">
            <div id="box3"></div>
        </div>
    </div>
    <script>
        box1.onclick = function() {
            console.log('box1');
        }
        box2.onclick = function() {
            console.log('box2');
        }
        box3.onclick = function() {
            console.log('box3');
        }
    </script>



在这里插入图片描述
当我们点击box1时都知道输出box1,可是当我们点击box3时弹出什么呢?
在这里插入图片描述
点击box3会弹出其他的是因为事件冒泡。
在这里插入图片描述
这就叫做事件冒泡,一级一级往上冒直到window

DOM2级

 <div id="box1">
        <div id="box2">
            <div id="box3"></div>
        </div>
    </div>
    <script>
        box1.addEventListener('click', function() {
            console.log('box1');
        }, false);
        box2.addEventListener('click', function() {
            console.log('box2');
        }, false);
        box3.addEventListener('click', function() {
            console.log('box3');
        }, false);
    </script>

输出跟上面是一样的,因为我们绑定在了冒泡阶段。(true捕获,false冒泡)
再来看看捕获阶段是怎么样的

    <div id="box1">
        <div id="box2">
            <div id="box3"></div>
        </div>
    </div>
    <script>
        box1.addEventListener('click', function() {
            console.log('box1');
        }, true);
        box2.addEventListener('click', function() {
            console.log('box2');
        }, true);
        box3.addEventListener('click', function() {
            console.log('box3');
        }, true);
    </script>

点击box可以看到
在这里插入图片描述
相比之前 现在顺序反过来了,是因为事件捕获

在这里插入图片描述

这就是捕获阶段,跟冒泡阶段完全相反。

那冒泡跟捕获的执行顺序是什么样的呢?我分别在每一个元素上绑定了两个阶段的同一事件,来看看触发的顺序。

<div id="box1">
        <div id="box2">
            <div id="box3"></div>
        </div>
    </div>
    <script>
        box1.addEventListener('click', function() {
            console.log('box1 捕获阶段');
        }, true);
        box2.addEventListener('click', function() {
            console.log('box2 捕获阶段');
        }, true);
        box3.addEventListener('click', function() {
            console.log('box3 捕获阶段');
        }, true);
        box1.addEventListener('click', function() {
            console.log('box1 冒泡阶段');
        }, false);
        box2.addEventListener('click', function() {
            console.log('box2 冒泡阶段');
        }, false);
        box3.addEventListener('click', function() {
            console.log('box3 冒泡阶段');
        }, false);

点击box3看到,先捕获后冒泡。
在这里插入图片描述
也不是都是这样

box1.addEventListener('click', function(){
	console.log('box1 捕获阶段');
},true);
box2.addEventListener('click', function(){
	console.log('box2 捕获阶段');
},true);
box1.addEventListener('click', function(){
	console.log('box1 冒泡阶段');
},false);
box2.addEventListener('click', function(){
	console.log('box2 冒泡阶段');
},false);
box3.addEventListener('click', function(){
	console.log('box3 冒泡阶段');
},false);
box3.addEventListener('click', function(){
	console.log('box3 捕获阶段');
},true);  // 将box3的捕获阶段放到box3的冒泡阶段后面


在这里插入图片描述
用图来看一下。
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值