事件冒泡

所谓事件冒泡是指当子元素触发一个事件之后会触发父级元素发生同类型的事件。

举个栗子:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Aui车养护</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        li {
            list-style: none;
        }
        a {
            text-decoration: none;
        }
        #wrap {
            position: relative;
            width: 200px;
            height: 200px;
            margin: 50px auto;
            background-color: #f66;
        }

        #box {
            position: absolute;
            left: 50%;
            top: 50%;
            width: 100px;
            height: 100px;
            transform: translate(-50%, -50%);
            background-color: green;
        }
    </style>
</head>
<body>
    <div id="wrap">
        <div id="box">
        </div>
    </div>
    <script>
        wrap.onclick = () => {
            console.log("点击了大盒子");
        }
        box.onclick = () => {
            console.log("点击了小盒子");
        }
    </script>
</body>

</html>

当我们点击小盒子的时候,会同时触发父级盒子。这在有些场合是我们不需要的,比如父级和子级元素都有相同的事件但是操作的内容是不同的,当点击子元素时子元素隐藏,再点击父元素时让盒子显示。你会发现无法实现。(顺便说一下,元素的id属性,不获取也是可以直接拿来使用的,但是真正开发的时候不推荐。)

 <script>
        wrap.onclick = () => {
            console.log("点击了大盒子");
            box.style.display = "block";
        }
        box.onclick = () => {
            console.log("点击了小盒子");
            box.style.display = "none";
        }
    </script>

那么问题来了,我们怎么避免这样的事情发生呢?那就要阻止事件冒泡了,但是这个东西有个不好的地方就是兼容性的问题。

正常模式 :e.stopImmediatePropagation() 也可以简写为e.stopPropagation();

兼容ie:   e.cancleBubble = true;

 <script>
        wrap.onclick = () => {
            console.log("点击了大盒子");
            box.style.display = "block";
        }
        box.onclick = (e) => {
            e = e || window.event;
            e.stopPropagation?e.stopPropagation():e.cancleBubble = true;
            console.log("点击了小盒子");
            box.style.display = "none";
        }
    </script>

这样就能完美实现了,美滋滋...

任何事物都有两面性,事件冒泡也有他有利的一面,在接下来我会介绍事件委托代理原理,就是应用事件冒泡来实现的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值