事件委托指的是给父元素注册事件,委托给子元素处理
1.为什么要使用事件委托
在 JavaScript 中,页面内事件处理程序的个数会直接影响页面的整体性能,因为每个事件处理程序都是对象,对象会占用内存,内存中的对象越多,页面的性能则越差。此外,事件处理程序需要与 DOM 节点进行交互,访问 DOM 的次数越多,引起浏览器重绘和重排的次数也就越多,从而影响页面的性能。
2.事件委托实现原理
事件委托是利用事件的冒泡原理来实现的,大致可以分为
三个步骤:
确定要添加事件元素的父级元素;
给父元素定义事件,监听子元素的冒泡事件;
使用 event.target 来定位触发事件冒泡的子元素。
3.事件委托的优点:
1.
减少事件注册,节省内存2.
在table上代理所有td的click事件3.
在ul上代理所有的li的click事件4.
简化了dom节点更新时,对应事件的更新5.
不用在新添加的li上绑定click事件6.
当删除某个li时,不用移解绑上面的click事件
<ul id="list">
<li>item 1</li>
<li>item 2</li>
<li>item 3</li>
......
<li>item n</li>
</ul>
```
4.缺点:
1.事件委托给予冒泡,对于不冒泡的事件不支持. 2.层级过多,冒泡过程中,可能会被某层阻止掉 3.理论上委托会导致浏览器频繁调用处理函数,,虽然很可能不需要处理,所以建议就近委托,比如在table上代理id, 而不是在doncument上代理td
5.总结
要使用事件委托,需要保证事件能够发生冒泡,适合使用事件委托的事件有 click、keydown、keyup 等。需要注意的是,虽然 mouseover 和 mouseout 事件也会发生事件冒泡,但处理起来非常麻烦,所以不推荐在 mouseover 和 mouseout 事件中使用事件委托。 另外,对于不会发生事件冒泡的事件(例如 load、unload、abort、focus、blur 等),则无法使用事件委托。