javascript对象之this、currentTarget和target

本文详细解析javascript中对象this、currentTarget和target的用法,并通过实例演示它们之间的区别,帮助开发者深入理解事件处理过程。

//说明:以下都是在DOM的事件模型下,因为currentTarget和target为DOM模型所特有,IE的事件模型下是srcElement。额,说错了,ie11貌似也支持。

原文链接:http://www.jb51.net/article/28122.htm

target在事件流的目标阶段;currentTarget在事件流的捕获,目标及冒泡阶段。只有当事件流处在目标阶段的时候,两个的指向才是一样的,而当处于捕获和冒泡阶段的时候,target指向被单击的对象而currentTarget指向当前事件活动的对象(一般为父级)。

------------------------------------------------------------------------------------------------------------------------------------------------------------------------

原文链接:http://www.jb51.net/article/32931.htm

event.currentTarget与event.target的区别想大家在使用的时候不是很在意,本文以测试代码来讲解它门之间的不同
event.currentTarget identifies the current target for the event, as the event traverses the DOM. It always refers to the element the event handler has been attached to as opposed to event.target which identifies the element on which the event occurred.
即,event.currentTarget指向事件所绑定的元素,而event.target始终指向事件发生时的元素。

——-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

原文链接:http://www.jquerycn.cn/a_10422

本文介绍下,javascript中对象this、currentTarget和target的用法,有需要的朋友参考下吧。

在javascript中,尤其是在事件处理程序内部,对象this始终等于currentTarget的值,而target则只包含事件的实际目标。
如果直接将事件处理程序指定给了目标元素,则this、currentTarget和target包含相同的值。

例子:

var btn = document.getElementById("myBtn");
btn.onclick = function (event) {
    alert(event.currentTarget === this); //ture
    alert(event.target === this); //ture
};

以上例子检测了currentTarget和target与this的值。
由于click事件的目标是按钮,因此这三个值是相等的。如果事件处理程序存在于按钮的父节点中,那么这些值是不相同的。

例子:

document.body.onclick = function (event) {
    alert(event.currentTarget === document.body); //ture
    alert(this === document.body); //ture
    alert(event.target === document.getElementById("myBtn")); //ture
};

当单击这个例子中的按钮时,this和currentTarget都等于document.body,因为事件处理程序是注册到这个元素的。
然而,target元素却等于按钮元素,因为它是click事件真正的目标。由于按钮上并没有注册事件处理程序,结果click事件就冒泡到了document.body,在那里事件才得到了处理。

看下面代码,依次弹出[object HTMLInputElement]、[object HTMLInputElement]、[object HTMLInputElement]、[object HTMLBodyElement]、[object HTMLBodyElement]、[object HTMLInputElement]

<pre name="code" class="javascript"><pre name="code" class="javascript">var btn = document.getElementById("myBtn");
var handler = function(event) {
  alert(this) ;
  alert(event.currentTarget);
  alert(event.target);
};
document.body.onclick = handler;
btn.onclick = handler;



在需要通过一个函数处理多个事件时,可以使用type属性。

例如:
 

复制代码 代码示例:
var btn = document.getElementById("myBtn");
var handler = function (event) {
        switch (event.type) {
        case "click":
            alert("Clicked");
            break;
        case "mouseover":
            event.target.style.backgroundColor = "red";
            bread;
        case "mouseout":
            event.target.style.backgroundColor = "";
            break;
        }
    };
btn.onclick = handler;
btn.onmouseover = handler;
btn.onmouseout = handler;

<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、付费专栏及课程。

余额充值