event.target始终是真正被点击的最内层元素,event.currentTarget是当前执行事件处理函数的绑定元素;前者固定为触发源,后者随事件传播阶段变化,常用于事件委托。

关键在理解 event.target 和 event.currentTarget 的区别:前者永远是**真正被点击(或触发)的那个最内层元素**,后者是**当前正在执行事件处理函数的那个元素**——也就是你绑定监听器的那个元素。
目标元素(target)是“谁被点”
它由用户交互直接决定,不会随事件传播改变。比如点击一个按钮,即使事件冒泡到外层 div,event.target 始终是那个按钮本身。
- 不管监听器绑在哪一层,
target永远指向原始触发源 - 动态添加的子元素,只要没单独绑监听器,也能通过
target准确识别 - 常用于事件委托中判断具体哪个子元素被操作
当前元素(currentTarget)是“谁在响应”
它取决于事件传播到哪一层、哪一层的监听器正在运行。冒泡过程中,每经过一个绑了监听器的祖先元素,currentTarget 就变成那个祖先。
- 在目标阶段,
target === currentTarget - 在冒泡阶段,
currentTarget是父级、祖父级等正在执行 handler 的元素 - 用
this在普通函数中也等价于currentTarget
用代码直观对比
假设结构:<div id="box"><button>点我</button></div>
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
给 #box 和 button 都绑 click 监听器:
- 点 button → 先触发 button 上的 handler:
target和currentTarget都是 button - 再冒泡到 #box → 触发 box 上的 handler:
target还是 button,currentTarget变成 div#box
怎么快速验证?加一行 console 就清楚
在任意事件回调里写:console.log('target:', event.target, 'currentTarget:', event.currentTarget);
- 点击子元素时,看输出就能立刻分辨两者差异
- 配合
event.eventPhase(1=捕获,2=目标,3=冒泡)还能定位当前处于哪一阶段

















