导读:本期聚焦于香港程序员创作的《剖析jQuery中event.target与event.currentTarget在事件委托中的指向差异与图解》,敬请观看详情。为什么在jQuery事件委托中,同一个事件对象里的event.target和event.currentTarget会指向不同的元素?不少人在给列表或表格绑定代理事件时,因为混淆这两个属性导致逻辑判断出错,比如点击子元素却拿到容器元素做处理。本文将围绕DOM事件流的捕获与冒泡机制,剖析两个属性的底层指向规则,结合on方法的事件委托写法给出图解式说明,并通过代码验证在不同层级节点上取值的变化,帮助你彻底分清目标元素与绑定元素,写出更稳妥的事件处理逻辑。

在使用jQuery做事件委托时,事件对象里有两个非常容易混淆的属性:event.targetevent.currentTarget。很多人写了一段委托代码,点击子元素后却发现拿到的元素和自己预想的不一致,排查半天才发现问题就出在对这两个属性的理解上。简单来说,event.target永远是事件最初被触发的那个真实目标元素,而event.currentTarget则是当前事件处理器所绑定的那个元素。本文结合事件流的传播过程,用图解加代码的方式把两者的指向规则彻底讲清楚。

剖析jQuery中event.target与event.currentTarget在事件委托中的指向差异与图解

一、从DOM事件流理解两个属性的本质区别

要分清这两个属性,必须先理解事件的传播路径。浏览器中一次点击事件并不是简单地发生在被点击的元素上,而是经历三个阶段:捕获阶段从document一路向下传递到目标元素,目标阶段在目标元素上触发,冒泡阶段再从目标元素逐层向上回到document。jQuery的on方法默认在冒泡阶段监听事件,事件委托正是利用了冒泡机制实现的。

在整个传播路径上,event.target的值是固定不变的,它始终指向事件最初发生的那个元素,也就是用户实际操作的那个最内层节点。而event.currentTarget则不同,它是一个动态属性,表示的是当前正在执行事件处理函数的那个元素。由于处理函数只绑定在委托容器上,所以在jQuery委托场景里,event.currentTarget就等于你调用on方法时匹配到选择器的那个元素本身。

举个直观的例子:有一个ul列表,事件绑定在ul上,委托给li处理。当用户点击li内部的span文字时,event.target是那个span,而event.currentTarget是li,jQuery会根据选择器在冒泡路径上匹配元素并把this指向它。如果点击的是li本身的空白区域,那么两个属性就都指向li。这种动态差异正是很多问题的来源。

二、用代码验证指向差异

下面用一个具体例子来验证。构造一个三层嵌套的结构:ul作为委托容器,li是条目,span是条目内的文字:

<ul id="list">
  <li>第一条 <span>删除</span></li>
  <li>第二条 <span>删除</span></li>
</ul>

然后用jQuery的on方法做事件委托:

$('#list').on('click', 'li', function (e) {
  console.log('target:', e.target.tagName);
  console.log('currentTarget:', e.currentTarget.tagName);
  console.log('this === e.currentTarget:', this === e.currentTarget); // true
});

运行后点击li中的文字,控制台输出target: SPANcurrentTarget: LI;点击li的空白处,两者都会输出LI。这验证了前面的结论:this在jQuery委托中与event.currentTarget等价,都指向选择器匹配到的元素。如果业务逻辑需要拿到条目本身,正确做法是使用$(this)$(e.currentTarget),而不是$(e.target),后者在点击到span时会让你拿到错误的元素。

再看一个原生对比,帮助理解jQuery做了什么包装。原生写法中委托通常是:

document.getElementById('list').addEventListener('click', function (e) {
  if (e.target.tagName === 'SPAN') {
    var li = e.target.closest('li');
    console.log('条目是', li.textContent);
  }
});

原生场景下event.currentTarget永远等于绑定监听的ul,因为处理函数就在ul上执行,浏览器不会帮你做选择器匹配;而jQuery的委托机制内部会在冒泡路径上逐层检查节点是否匹配传入的li选择器,匹配到后调用处理函数并把this指向该li,这就是两者表现不同的根源。

三、实际开发中的典型陷阱与正确用法

最常见的陷阱是在判断点击来源时误用event.target做逻辑分支。比如一个列表中点击条目打开详情、点击条目内按钮删除数据,如果统一用$(e.target)去取数据,当用户点在按钮上时可能取到按钮而点在文字上时取到span,导致取值逻辑混乱。正确做法是先用$(e.currentTarget)$(this)确定条目容器,再用$(e.target).closest('button')判断具体操作:

$('#list').on('click', 'li', function (e) {
  var $li = $(this);
  var $btn = $(e.target).closest('button');
  if ($btn.length) {
    console.log('删除条目:', $li.index());
  } else {
    console.log('打开条目:', $li.text());
  }
});

另一个陷阱是在阻止事件传播时混淆两者。e.stopPropagation()阻止的是事件继续冒泡,不会改变event.target的值;而如果在非委托绑定(直接绑定在按钮上)的场景下处理事件,此时event.targetevent.currentTarget才会完全一致,都等于绑定元素本身。理解了这一点,就能在直接绑定与委托绑定之间自由切换而不出错。

总结一下记忆口诀:target看用户点在哪,currentTarget看代码绑在哪。委托场景下前者随时可能变化,点到的子元素不同结果就不同,后者固定为选择器匹配的元素。分清这两个指向,事件委托相关的绝大多数问题都能迎刃而解。

event.targetevent.currentTargetjQuery事件委托修改时间:2026-09-09 05:12:42

免责声明:已尽一切努力确保本网站所含信息的准确性。网站作品多为原创整理与精心创作,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们进行处理Email:chomcom@qq.com。
引用或转载本作品时,请注明当前出处:https://www.ipipp.com/html/20260909/53212.html,基于非商业用途的前提下,欢迎转载或二创本作品。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。