事件委托通过绑定父元素监听器并利用事件冒泡,由event.target识别真实触发目标,适用于动态内容和大量子元素场景,节省内存且自动支持新增元素,但不适用于不冒泡事件。
事件委托利用事件冒泡机制,把事件监听器绑定在父元素上,由父元素统一处理子元素的事件,而不是给每个子元素单独绑定。核心在于通过 event.target 判断真正触发事件的子元素。
当用户点击某个子元素(如列表项 ),事件会从该元素向上逐层冒泡到父容器(如 )。如果父容器绑定了监听器,就能捕获这个冒泡上来的事件,并用 event.target 获取原始点击目标:
event.target.matches(selector) 或属性判断来识别目标元素button.delete 选择器,就能被父级统一响应适合动态内容和大量子元素的场景:
不是万能方案,有其适用边界:
focus、blur、mouseenter 等不冒泡的事件无法委托(可用 focusin/focusout 替代)
增加判断开销:每次触发都要检查 event.target,对高频事件(如 mousemove)需谨慎使用没有绝对优劣,关键看场景:
useCapture = true)不复杂但容易忽略:委托是否生效,取决于事件是否真的冒泡到了你绑定的那层,以及 event.target 是否是你想匹配的那个元素。