JavaScript事件委托是如何工作的?
原文链接:How JavaScript Event Delegation Works
事件委托有着充分的理由作为JavaScript中最热门的方法之一。事件委托避免你为每一个明确节点添加事件监听,与之代替的是添加事件到父节点。通过事件冒泡查找到匹配的子元素。基础概念相当简单,不过许多人并不理解事件委托是如何工作的。下面让我们通过一个基础的JavaScript示例来演示事件委托是如果工作的。
假设我们有这样一个带有子节点的ul
标签:
1 | <ul id="parent-list"> |
通常点击子元素时需要发生些事情。你当然可以为每一个li
元素添加事件监听,但如果需要频繁的从列表中添加或删除li
呢?添加和删除事件监听将会是一场噩梦,特别是如果添加和删除代码位于程序的不同位置。最好的解决方案是将监听事件添加到父元素ul
。监听事件添加到父元素,又如何知道是哪个元素被点击了呢?
简单:但事件冒泡至ul
元素,通过事件对象target
属性获取真实点击元素。下面是一段非常基础的JavaScript片段,它演示了事件委托:
1 | // 获取元素,添加click监听事件... |
首先添加一个点击事件监听器。当监听事件被触发,检测事件元素以确保它就是要响应的元素。如果刚好是li
,噢:这正是我们需要的。如果不是我们想要的元素,就忽略事件。示例相当简单——ul
和li
是一个直接的比较。让我们试试更难的,我们有一个父div
,它有很多子元素,但我们只关心一个class为classA
的a
标签。
1 | // 拿到父元素DIV,添加click监听事件... |
使用Element.matches API(注:MDN),可以查看元素是否为我们期望目标。
因为大多数开发者使用了JavaScript库来处理DOM元素事件,因此建议使用类库提供的事件委托方法,它们能够进行高级委派和元素识别。
希望这可以帮助您直观地了解事件委托背后的概念,并发挥它的力量!