e-target与e-currentTarget的区别

本文通过具体代码示例,详细解析了在WXML事件处理中e.target与e.currentTarget的区别,探讨了它们在事件委托机制中的作用,以及如何正确使用这两个属性来获取预期的数据。

e.target与e.currentTarget的区别

先贴上代码

          <view wx:if="{{useSpecialDelivery}}" class="h-v3">
                <view class="h-v3-1-detail">
                    <view ><icon class="iconfont icon-home-waimai home-icon"></icon></view>
                    <view wx:if="{{takeOutFoodButton}}" catchtap="preOrder" data-dinnerType='1' data-tradeTypeCode='2'>
                        <view>无接触配送</view>
                        <image src='{{homeImages}}'wx:if="{{takeOutFoodButton &&!tangShiFoodButton}}" class="homeImages"></image>
                        <view style="line-height:55rpx">外卖点餐</view>
                        <view>家庭厨房/美味自煮</view>
                    </view>

                    <view class="h-v3-1-hr" wx:if="{{tangShiFoodButton && takeOutFoodButton}}"></view>

                    <view catchtap="preOrder" data-dinnerType='2' data-tradeTypeCode='1' wx:if="{{tangShiFoodButton}}" class="h-v3-1-item-title h-v3-1-item-title-detail title-right">
                        <view class="h-v3-1-item-title-tip item-title-tip-right">无接触点取</view>
                        <image src='{{homeImages}}' wx:if="{{tangShiFoodButton &&!takeOutFoodButton}}" class="homeImages" data-dinnerType='2' data-tradeTypeCode='1'></image>
                        <view style="line-height:55rpx" data-dinnerType='2' data-tradeTypeCode='1'>堂食点餐</view>
                        <view class="statement" data-dinnerType='2' data-tradeTypeCode='1'>店内就餐/打包带走</view>
                    </view>
                     <view catchtap="preOrder" data-dinnerType='2' data-tradeTypeCode='1'><icon class="iconfont icon-home-store home-icon" style="font-size:62rpx !important"></icon></view>
                </view>
            </view>
preOrder () {
    //点击上方的外卖点餐的文字,没有 data-$value
    //e.target.dataset 是个 {}; 而e.currentTarget.dataset 拥有预期的值
    //点击上方的堂食点餐的文字
    //e.target.dataset 拥有预期值,因为加上了data-$value; 而e.currentTarget.dataset 拥有预期的值
    //catch事件和target这个特性来进行事件委托
}

参考链接: https://www.jianshu.com/p/1dd668ccc97a

<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` | ❌ | ✅(普通函数中) | | 事件委托 | 关键属性 | 较少使用 | | 动态元素 | 有效识别 | 无法识别动态内容 | | 嵌套元素 | 可能指向内部元素 | 始终指向绑定元素 |
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值