JavaScript之 事件委托? 如果阻止事件冒泡?

什么是事件委托?

         事件委托就是利用冒泡的原理,将事件加到 父元素 或 祖先元素上,触发执行效果!

说起事件委托我们先来了解一下事件的三个阶段:

        1. 事件捕获阶段(从外到内

            产生事件的时候会从document发出一个事件流,这个事件流随着我们的DOM树流向触发事件的目标;

       2. 事件目标阶段

           如果这个目标上有事件,则会被触发;如果没有,在当前目标上没有事件触发;

       3. 时间冒泡阶段(从内到外

           如果祖先元素绑定有事件,那么这个事件会被依次触发,从内到外的顺序; 

例子:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>事件委托练习</title>
    <script src="../../../jquery.min.js"></script>
    <style>
        .one {
            width: 500px;
            height: 500px;
            background-color: aquamarine;
            margin: 100px 500px;
        }
        .two {
            width: 300px;
            height: 300px;
            background-color: rgb(222, 245, 17);
        }
    </style>
</head>
<body>
    <div class="one">
        <div class="two"></div>
    </div>
    <script>
        $('.one').on('click',function(){
            alert('您点击的是第一个盒子')
        })

        $('.two').on('click',function(){
            alert('您点击的是第二个盒子')
        })
    </script>
</body>
</html>

  如题:给两个盒子绑定点击事件,但是我想要的结果是点击第二个盒子的话弹出框,这时你会发现,第二个盒子点击之后紧接着第一个盒子也会弹出框,这就是事件冒泡;

看下什么是事件冒泡?

          事件冒泡,就是元素自身的事件被触发后,如果父元素有相同的事件,如onclick事件,那么元素本身的触发状态就会传递,也就是冒到父元素,父元素的相同事件也会一级一级根据嵌套关系向外触发,直到document/window,冒泡过程结束!

那如何阻止时间冒泡?

          使用  e(event).stopPropagation()  起到阻止捕获和冒泡阶段中当前事件的进一步传播。

    事件对象e : 事件触发的时候会自动生成一个事件对象,生命周期是从事件开始到事件结束,有位置信息(事件本身是谁)、触发的事件类型、触发的事件元素等......

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>事件委托练习</title>
    <script src="../../../jquery.min.js"></script>
    <style>
        .one {
            width: 500px;
            height: 500px;
            background-color: aquamarine;
            margin: 100px 500px;
        }
        .two {
            width: 300px;
            height: 300px;
            background-color: rgb(222, 245, 17);
        }
    </style>
</head>
<body>

    <div class="one">
        <div class="two"></div>
    </div>

    <script>
        $('.one').on('click',function(){
            alert('您点击的是第一个盒子')
        })

        $('.two').on('click',function(e){
            e.stopPropagation(); // 阻止事件冒泡,如果不阻止的话就会你点第二个的话结束之后第一个也会弹出
            alert('您点击的是第二个盒子')
        })
    </script>
</body>
</html>

这样就不会出现点第二个盒子第一个盒子也会弹出框!

拓展问题:如果第二个盒子是通过js增加的元素,没有事件;该如何解决?

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>事件委托练习</title>
    <script src="../../../jquery.min.js"></script>
    <style>
        .one {
            width: 500px;
            height: 500px;
            background-color: aquamarine;
            margin: 100px 500px;
        }
        .two {
            width: 300px;
            height: 300px;
            background-color: rgb(222, 245, 17);
        }
    </style>
</head>
<body>
    <div class="one">
        <!-- <div class="two"></div> -->
    </div>
    <script>
        //如果是你之后添加的元素 怎么办?
        $(`<div class="two"></div>`).appendTo('.one');
        
        $('.one').on('click','.two',function(e){
            e.stopPropagation(); // 阻止事件冒泡,如果不阻止的话就会你点第二个的话结束之后第一个也会弹出
            alert('您点击的是第二个盒子')
        })
    </script>
</body>
</html>

使用事件委托,将当前元素的事件委托给祖先元素(需要注意的是 当前的事件必须是祖先元素的子元素)。

发布了75 篇原创文章 · 获赞 7 · 访问量 6903

猜你喜欢

转载自blog.csdn.net/HelloWord176/article/details/103168994
今日推荐