什么是事件代理

一、什么是事件代理

事件代理又叫事件委托,是在网页设计中的一种设计思想,即把一个或者一组元素(目标元素)的事件绑定到父级或者祖先级元素上。真正绑定事件的是外层元素,⽽不是⽬标元素。

当事件响应到⽬标元素上时,会通过事件冒泡机制从⽽触发它的外层元素的绑定事件上,然后在外层元素上去执⾏函数。

举个例子——疫情封寝的时候,一个寝室大家都要买饭,如果每个人都出去就很麻烦,这时就委托一个志愿者帮忙给寝室每个人带饭,然后把饭分给每个人,这个就是事件代理。

二、案例

点击x号的饭,在下方获得随机4位数的手机尾号

<style>
        /* *{
            margin: 0;
            padding: 0;
        } */
        .box1 {
            width: 150px;
            height: 500px;
            background-color: antiquewhite;
            display: flex;
            flex-direction: column;
            justify-content: center;
            align-items: center;
        }
​
        .box2 {
            width: 100px;
            height: 80px;
            background-color: azure;
            margin-top: 10px;
            text-align: center;
            line-height: 25px;
        }
​
        .add {
            height: 50px;
            margin-bottom: 20px;
        }
 </style>
​
    <button class="add">点击添加带饭</button>
    <div class="box1">志愿者带饭
        <div class="box2">1号的饭</div>
        <div class="box2">2号的饭</div>
        <div class="box2">3号的饭</div>
        <div class="box2">4号的饭</div>
        <div class="box2">5号的饭</div>
    </div>
​
    <script>
        var add=document.querySelector(".add"),
        box1=document.querySelector(".box1"),
        box2s=document.querySelectorAll(".box2");
​
        // 给button按钮绑定点击事件:点击添加带饭
        add.addEventListener("click",function(){
            // 创建一个新的div
            var box2=document.createElement("div");
            // 获取box1的子元素个数
            var n=box1.children.length+1;
            // 给新创建的div添加类名
            box2.className="box2";
            // 给新div添加内容
            box2.innerHTML=`${n}号的饭`
            // 把box2添加进box1的子元素
            box1.appendChild(box2);
            // 同时需要把box1的高度也增加
            box1.style.height=parseFloat(window.getComputedStyle(box1).height)+90+"px"
        })
​
        // 先不用事件代理,给box2绑定点击事件:点击x号的饭,在下方获得手机尾号(4位随机数)
        // box2s.forEach(el=>{
        //     el.addEventListener("click",function(){
        //         // 产生四位数的手机尾号
        //         var sjwh=parseInt(Math.random()*(9999-1000+1000));
        //         // 在下方显示手机尾号
        //         el.innerHTML=`${el.innerHTML}<br>手机尾号是${sjwh}`;
        //     })
        // })
​
        // 用事件代理,绑定到父元素box1上
        box1.addEventListener("click",function(el){
            // 产生四位数的手机尾号
            var sjwh=parseInt(Math.random()*(9999-1000+1000));
                // 在下方显示手机尾号
                el.target.innerHTML=`${el.target.innerHTML}<br>手机尾号是${sjwh}`;
        })
    </script>

三、小结

  • 优点:

(1)降低性能的消耗,减少整个⻚⾯所需的内存,提升整体性能(减少冗余,节约资源)

(2)可以实现动态绑定,减少重复⼯作

  • 局限性:

(1)有些事件(没有冒泡特性的)不可以用事件代理进行绑定,比如focus、blur

(2)mousemove 、 mouseout 这样的事件,虽然有事件冒泡,但是需要不断计算位置定位,对性能消耗高,也是不适合用事件代理的

(3)如果把所有事件都⽤事件代理,可能会出现事件误判,即本不该被触发的事件被绑定上了事件

  • 主要解决的问题:

    解决静态的事件绑定问题;解决业务相同,而性能消耗却更高的问题。

  • 适合用事件代理的事件:

click、mousedown、mouseup、keydown、keyup、keypress

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值