是。currenttarget 总是等于事件监听器绑定的元素,它始终指向当前事件处理程序所附加的 dom 节点,与事件冒泡路径无关;而 target 指向实际触发事件的最深子元素,二者在事件委托中必然不同。

currentTarget 总是等于事件监听器绑定的元素吗?
不是。在事件委托场景中,currentTarget 指向的是「当前正在处理该事件的监听器所挂载的那个节点」,而 target 才是真正被点击/触发的最深子元素。这个区别决定了你能不能靠它稳稳锁定编辑器容器本身——比如一个 contenteditable 的 <div id="editor"> 上绑了 <code>click,用户点进里面某个 <span class="mention">@张三</span>,此时 target 是那个 span,currentTarget 才是 #editor。
为什么不能只用 target 去判断编辑器容器?
因为 target 会随用户操作位置剧烈变化:点空白处可能是 textNode,点图片是 <img>,点嵌套 <div> 里的按钮又是另一个元素。一旦你写 <code>if (e.target === editorEl) 或依赖 e.target.closest('#editor'),就容易漏判或误判——尤其当编辑器内容动态渲染、有 Shadow DOM 或跨 iframe 场景时,closest() 可能失效或查到父级容器外。
-
currentTarget在事件冒泡到监听器那一刻就确定,不受内部结构干扰 - 只要监听器直接绑定在编辑器根元素上,
e.currentTarget就永远是你想锁死的那个容器 - 它不依赖 DOM 层级查找,性能更稳,也绕过了
shadowRoot边界问题(只要监听器挂在 shadow host 上)
在 contenteditable 编辑器里怎么安全读取 currentTarget?
关键不是「怎么读」,而是「什么时候读」和「读完怎么用」。事件委托必须确保监听器在冒泡阶段执行(默认就是),且不能被中间节点的 stopPropagation() 截断——这点在富文本编辑器里特别常见,比如某些 toolbar 插件或 inline widget 会主动阻止冒泡。
- 监听器必须直接绑定在编辑器容器上,不要委托给 body 或 document(否则
currentTarget就不是容器了) - 避免在子元素 handler 中调用
e.stopPropagation(),如需局部拦截,改用e.stopImmediatePropagation()并确保不影响容器级逻辑 - 示例:给
#editor绑mousedown处理光标定位,直接用e.currentTarget获取容器,再调用getSelection().getRangeAt(0).commonAncestorContainer配合判断是否仍在其内
document.getElementById('editor').addEventListener('click', function(e) {
const container = e.currentTarget; // 这里永远是 #editor 元素
if (e.target.matches('span.mention')) {
handleMentionClick(container, e.target);
}
});
currentTarget 在 focus/blur 类事件里还可靠吗?
不可靠。focus 和 blur 不冒泡,所以你无法在父容器上监听它们并指望 currentTarget 指向容器——浏览器根本不会把事件传上来。这时候必须换思路:用 focusin/focusout(它们冒泡),或者直接在编辑器容器上监听 focus,但要确认该容器本身可聚焦(加 tabindex="0")。
-
focusin事件中currentTarget才稳定指向容器,且能捕获子元素获得焦点的时刻 - 如果编辑器内容由框架(如 React)动态生成,注意
contenteditable元素的tabindex是否被覆盖或丢失 - 别试图在
blur回调里用currentTarget判断编辑器失焦——它可能已指向别的元素,甚至为 null
currentTarget 的信任,建立在「监听器绑定位置」和「事件是否冒泡」两个硬条件上。编辑器越复杂,越要先确认这两点,而不是等出 bug 了再回头查监听器挂在哪、用了什么事件类型。











