事件冒泡和事件捕获

事件的三个阶段

  1. 捕获阶段
  2. 当前目标阶段
  3. 冒泡阶段
    事件对象.eventPhase属性可以查看事件触发时所处的阶段
    冒泡事件:事件由目标元素往外层触发,至document元素
 <style>
        .box1 {
            width: 300px;
            height: 300px;
            background-color: cyan;
        }
        
        .box2 {
            width: 200px;
            height: 200px;
            background-color: darkorange;
        }
        
        .box3 {
            width: 100px;
            height: 100px;
            background-color: darkorchid;
        }
    </style>
</head>

<body>
    <div class="box1" id="box1">
        box1
        <div class="box2" id="box2">
            box2
            <div class="box3" id="box3">box3</div>
        </div>
    </div>
<script>
        //获取元素
        var box1 = document.getElementById('box1')
        var box2 = document.getElementById('box2')
        var box3 = document.getElementById('box3')

        //注册监听事件  三个盒子都注册  
        //addEventLister有三个参数 第三个参数就是false的时候  表示是冒泡事件  也是默认的   档第三个参数是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)
    </script>

运行结果:依次点击

//依次点击box3  box2  box1
.冒泡 box3
.冒泡 box2
.冒泡 box1

.冒泡 box2
.冒泡 box1

.冒泡 box1

捕获事件:事件由外开始接受事件,至目标元素。

 <script>
 		//css代码和冒泡事件一样的  
        //获取元素
        var box1 = document.getElementById('box1')
        var box2 = document.getElementById('box2')
        var box3 = document.getElementById('box3')

        //注册监听事件  三个盒子都注册  
        //addEventLister第三个参数修改为true
        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>

运行结果:
在这里插入图片描述

//依次点击box3  box2  box1
捕获 box1
捕获 box2
捕获 box3

捕获 box1
捕获 box2

捕获 box1

解决冒泡事件的方法:

方法一:在js中加上代码e.stopPropagation(),IE则是使用e.cancelBubble = true
在js中加上代码即可

<script>
        //获取元素
        var box1 = document.getElementById('box1')
        var box2 = document.getElementById('box2')
        var box3 = document.getElementById('box3')

        //注册监听事件  三个盒子都注册  
        //addEventLister有三个参数 第三个参数就是false的时候  表示是冒泡事件  也是默认的   档第三个参数是true的时候就是捕获事件  
        box1.addEventListener('click', function() {

            console.log('box1');
        }, false)
        box2.addEventListener('click', function() {
            console.log('box2');
        }, false)
        box3.addEventListener('click', function(e) {
            e = e || window.event //处理兼容性问题
                //取消冒泡
            e.stopPropagation()
                // ie低版本取消冒泡 
                // e.cancelBubble = true
            console.log('box3');
        }, false)
    </script>

运行结果:

//此时点击box3
box3

方法二:在注册事件的时候直接使用onmouseleave 和onmouseenter 因为它们不会触发冒泡事件

 box1.onmouseenter = function() {
            console.log('box1');

        }
        box2.onmouseenter = function() {
            console.log('box2');

        }
        box3.onmouseenter = function() {
            console.log('box3');

        }

运行结果:

//此时进入box1 box2 box3
box1
box2
box3

总结:false 冒泡事件 true捕获事件
解决方法:JS代码中加上e.stopPropagation()
注册事件用onmouseleave 和onmouseenter 因为它们不会触发冒泡事件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值