currenttarget和target的区别(etarget和ecurrentTarget区别)

http://www.itjxue.com  2023-01-26 21:30  来源:未知  点击次数: 

JS事件对象中 target 和 currentTarget 的区别

今天我们就来简单谈谈JavaScript的Event事件对象中 target 和 currentTarget 两者之间的区别吧~

我们知道,想要获取某事件所绑定的元素,通常我们可以直接使用 this 对象即可。比如:

稍微给它们加点样式:

页面效果如下:

其中绿色盒子 id 为 box ,而红色盒子 id 为 container ,绿盒子是红盒子的子元素。现在,我给它们分别添加点击事件,目的是获取它们的 id 属性。

可以看到,只要我们给哪个元素绑定点击事件,那么事件执行时通过 this 所获取到的元素就是绑定点击事件的那个元素。

但是,并不是任何时候我们都可以通过 this 来获取当前绑定事件元素,比如当我们使用箭头函数或使用Vue.js框架时, this 就“失效”了。

有关箭头函数为什么会导致 this 指向问题,请戳→ ES6之箭头函数 。

这里的 this 指向的是当前Vue组件实例,所以 this.id 自然获取的是 data 中的 id 而不是 container 了。

那么,对于这个问题我们该如何解决呢?如何才能正确获取到当前绑定事件元素呢?

这时我们就需要用到事件对象中的 target 和 currentTarget 属性了。

我们看到,通过 target 和 currentTarget 都成功获取到了点击事件所绑定的DOM元素,那么 target 和 currentTarget 之间又有什么区别呢?

其实,只要我们将事件处理程序直接绑定到目标元素,那么目标元素事件执行时, target 和 currentTarget 均指向的是该目标元素。然而,如果事件处理程序并未绑定在目标元素,而是在其祖先元素上时,那么 target 则指向的是该目标元素,而 currentTarget 指向的是当前绑定事件的祖先元素。

可能看起来比较难理解,我们还是用最开始那个例子吧。

此时,只要 foo() 执行,那么 e.currentTarget.id 的值必然是 container ,因为 currentTarget 永远指向的是 事件所绑定的元素 (这里点击事件直接绑定在container元素上)。

但是 target 则不同,它指向的是 事件实际执行所在的元素 ,所以本例中 e.target.id 的值取决于鼠标直接所点击的元素。

① 鼠标直接点击container元素,也就是红色部分

这时 target 和 currentTarget 均指向的是container元素,因为事件执行的目标和事件绑定的目标是相同的,都是container元素。

② 鼠标直接点击box元素,也就是绿色部分

这时 target 指向的是box元素,而 currentTarget 指向的是container元素,因为事件执行的直接目标是box元素。

target和currenttarget的区别

比如说现在有A和B, A.addChild(B) A监听鼠标点击事件 那么当点击B时,target是B,currentTarget是A 也就是说,currentTarget始终是监听事件者,而target是事件的真正发出者

小程序target和currentTarget的区别

1:target指向的是触发事件的元素

比如在一个事件委托中,子元素把事件委托给父元素,子元素传参给到这个事件,这个时候,参数就会出现在target里面,因为,触发事件本身的是子元素名不是父元素

2.currentTarget指向的是捕获事件的元素,也就是绑定事件的元素本身

例如给一个元素绑定事件,并且是通过这个元素本身去触发的,这个时候传的参数就会出现在currentTarget中

e.target与e.currentTarget的区别

在DOM事件对象中有两个属性总是时不时的困扰我,就是 target 和 currentTarget ,有时候很迷惑分不清两者的区别,因此有必要把这两个属性好好梳理一下,加深理解,以便日后的查询。

MDN中对 target 的解释为,一个触发事件的对象的引用, 当事件处理程序在事件的冒泡或捕获阶段被调用时。

而对于currentTarget,它指的是当事件遍历DOM时,标识事件的当前目标。它总是引用事件处理程序附加到的元素,而不是 event.target ,它标识事件发生的元素。

举个例子来说明。

我们知道, e.target 可以用来实现 事件委托 ,该原理是通过事件冒泡(或者事件捕获)给父元素添加事件监听,e.target指向引发触发事件的元素,如上述的例子中, e.target 指向用户点击的 li ,由于事件冒泡, li 的点击事件冒泡到了 ul 上,通过给 ul 添加监听事件而达到了给每一个 li 添加监听事件的效果,而 e.currentTarget 指向的是给绑定事件监听的那个对象,即 ul ,从这里可以发现, e.currentTarget===this 返回 true ,而 e.target===this 返回 false 。 e.currenttarget 和 e.target 是不相等的。

注意 ,在jQuery提供的on方法中,e.currentTarget与该方法接收的第二个参数有关,根据jQuery的文档描述

当li中含有子元素的时候,e.target指的是触发事件的元素,可能是span也可能是li,此时的e.currentTarget指的是selector那个参数,也就是本例中的li。如果省略selector参数,那么它和addEventListener中e.target和e.currentTarget是一致的。

我们知道,在DOM事件流中分为几个不同的阶段,如图

在本例中,事件的目标阶段即 li ,由于 e.currentTarget 始终指向添加监听事件的那个对象,即 aLi[i] ,也就是HTML中的 li ,而 e.target 指向触发事件监听的那个对象,也是 li ,因此 e.target 和 e.currentTarget 相等,同时也和 this 相等。

因此不必记什么时候 e.currentTarget 和 e.target 相等,什么时候不等,理解两者的究竟指向的是谁即可。

(责任编辑:IT教学网)

更多

推荐ASP.NET教程文章