javascript中的事件代理

javascript中的事件代理

一、事件代理是什么

简单来说就是把一个元素的响应事件(如:click,keydow等)的函数委托到另一个元素上。

二、应用场景

在一个有很多项的列表中,如果要给每一项都添加一个响应事件,对内存的消耗是很大的。事件委托可以把点击事件绑定在父级元素ul上,在执行的时候再去匹配目标元素。

<html>
    <div>
        <ul id="list">
            <li>item 1</li>
            <li>item 2</li>
            <li>item 3</li>
            ......
            <li>item n</li>
        </ul>
    </div>
</html>
// 给父级元素绑定事件
document.getElementById('list').addEventListener('click', function (e) {
 // 兼容性处理
 var event = e || window.event;
 var target = event.target || event.srcElement;
 // 判断是否匹配目标元素
 if (target.nodeName.toLocaleLowerCase === 'li') {
 console.log('the content is: ', target.innerHTML);
 }
});

在列表项不多但是需要动态增删列表项的列表中,给每一项都绑定事件也可以用事件代理省去给新增项绑定事件和给待删项解绑事件的工作。

<input type="button" name="" id="btn" value=" " />
<ul id="ul1">
 <li>item 1</li>
 <li>item 2</li>
 <li>item 3</li>
 <li>item 4</li>
</ul>
const oBtn = document.getElementById("btn");
const oUl = document.getElementById("ul1");
const num = 4;
//事件委托,添加的子元素也有事件
oUl.onclick = function (ev) {
    ev = ev || window.event;
    const target = ev.target || ev.srcElement;
    if (target.nodeName.toLowerCase() == 'li') {
        console.log('the content is: ', target.innerHTML);
    }
};
//添加新的节点
oBtn.onclick = function () {
    num++;
    const oLi = document.createElement('li');
    oLi.innerHTML = `item ${num}`;
    oUl.appendChild(oLi);
};

使用事件委托,在动态绑定事件的情况下可以减少很多重复工作。

三、总结

适合使用事件委托的有:click,mousedown,mouseup,keydown,keyup,keypress。

使用事件委托的优势有:

  • 减少整个页面所需的内存,提升整体性能
  • 动态绑定,减少重复工作

局限性:

  • focus,blur这些事件没有事件冒泡机制,无法进行事件绑定。
  • mousemove,mouseout这种事件有事件冒泡机制,但是通过不断计算位置去定位,对性能消耗很大,不适合用事件委托。

这些事件如果用事件代理,可能出现事件误判,在不该触发的元素上绑定了事件。

  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值