e.target和this有什么区别?

本文详细解释了JavaScript中event.target与this的区别:event.target指向触发事件的元素,而this指向绑定事件的元素。同时,文章还对比了两者执行效率的不同,并解答了常见的关于两者比较的疑惑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.event.target与this的区别
event.target表示发生点击事件的元素;
this表示的是注册点击事件的元素
this 等于 e.currentTarget

this是所有函数原生具有的.进入函数时,this已经直接有了目标对象.
而e.target通过e再寻找target,中转了一下。所以相比较而言,this的执行效率更高些。
2 (this.target)(this)比较的问题
有人会问为什么(this.target)=(this)?
因为你用了jq来构造两个对象, 所以你最后一步比较的时候, 哪怕是两个对象的内容一模一样, 结果也是不想等的, 对象的比较比较的是指针, 两个指针
不一样所以是不想等的, 简单的说就是
var a = new Object();
var b = new Object();// 这两个对象看起来是一模一样的吧, 但是比较结果依然不想等
你直接比较 this == e.target 这样才能得出正确的结果

<think>我们正在讨论事件处理中的两个重要属性:e.target e.currentTarget。 在事件冒泡或捕获过程中,这两个属性代表不同的DOM节点。 简单来说: - e.target:指的是触发事件的原始元素(即事件最初发生的元素)。 - e.currentTarget:指的是当前正在处理该事件的元素(即绑定事件处理程序的元素)。 下面用代码示例详细解释来说明。</think>### `e.target` 与 `e.currentTarget` 的区别详解 在 JavaScript 事件处理中,`e.target` `e.currentTarget` 都是事件对象的重要属性,但它们代表不同的元素: #### 核心区别 | 属性 | 指向对象 | 是否变化 | 典型使用场景 | |------|----------|----------|--------------| | **`e.target`** | 实际触发事件的元素 | ❌ 固定不变 | 事件委托中识别实际触发元素 | | **`e.currentTarget`** | 当前处理事件的元素 | ✅ 随事件传播变化 | 访问绑定事件处理程序的元素 | --- ### 代码示例与解释 ```html <div id="parent"> <button id="child">点击我</button> </div> <script> const parent = document.getElementById('parent'); const child = document.getElementById('child'); parent.addEventListener('click', function(e) { console.log('target:', e.target.id); // 输出: child console.log('currentTarget:', e.currentTarget.id); // 输出: parent // 验证关系 console.log(e.target === child); // true console.log(e.currentTarget === parent); // true console.log(e.currentTarget === this); // true (在普通函数中) }); </script> ``` #### 执行结果: ``` target: child currentTarget: parent true true true ``` --- ### 详细说明 #### 1. **`e.target`** - **定义**:事件发生的**实际目标元素**(最深层元素) - **特点**: - 始终指向最初触发事件的元素 - 在事件传播过程中保持不变 - **使用场景**: ```javascript // 事件委托:在父元素处理子元素事件 document.querySelector('ul').addEventListener('click', (e) => { if(e.target.tagName === 'LI') { console.log('点击了列表项:', e.target.textContent); } }); ``` #### 2. **`e.currentTarget`** - **定义**:当前正在处理事件的元素 - **特点**: - 随事件传播阶段变化(捕获 → 目标 → 冒泡) - 在事件处理函数中等于 `this`(箭头函数除外) - **使用场景**: ```javascript // 访问绑定事件的元素属性 document.querySelectorAll('.btn').forEach(btn => { btn.addEventListener('click', function(e) { // 获取当前按钮的data属性 const action = e.currentTarget.dataset.action; console.log('执行操作:', action); }); }); ``` --- ### 事件传播阶段演示 ```html <div id="grandparent"> <div id="parent"> <div id="child">点击这里</div> </div> </div> <script> const logEvent = (phase) => (e) => { console.log(`${phase}:`); console.log(' target: ${e.target.id}'); console.log(' currentTarget: ${e.currentTarget.id}\n'); }; document.getElementById('grandparent').addEventListener( 'click', logEvent('捕获阶段'), true ); document.getElementById('parent').addEventListener( 'click', logEvent('目标阶段') ); document.getElementById('child').addEventListener( 'click', logEvent('冒泡阶段') ); </script> ``` #### 点击 `<div id="child">` 时的输出: ``` 捕获阶段: target: child currentTarget: grandparent 目标阶段: target: child currentTarget: child 冒泡阶段: target: child currentTarget: parent ``` --- ### 关键注意事项 1. **箭头函数中的 `this`**: ```javascript // 错误示例 button.addEventListener('click', (e) => { console.log(this); // 指向window(不是当前元素) console.log(e.currentTarget); // 正确方式获取当前元素 }); ``` 2. **事件委托模式**: ```javascript // 高效处理动态元素 document.body.addEventListener('click', (e) => { // 使用 target 识别实际点击元素 if(e.target.classList.contains('dynamic-item')) { // 处理逻辑 } }); ``` 3. **嵌套元素场景**: ```html <button id="btn"> <span>点击文字</span> </button> <script> btn.addEventListener('click', (e) => { console.log(e.target.tagName); // 可能是 SPAN console.log(e.currentTarget.tagName); // 总是 BUTTON }); </script> ``` --- ### 总结表格 | 特性 | `e.target` | `e.currentTarget` | |------|------------|-------------------| | 事件目标 | 原始触发元素 | 当前处理元素 | | 事件传播中 | 不变 | 随处理元素变化 | | 等于 `this` | ❌ | ✅(普通函数中) | | 事件委托 | 关键属性 | 较少使用 | | 动态元素 | 有效识别 | 无法识别动态内容 | | 嵌套元素 | 可能指向内部元素 | 始终指向绑定元素 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值