谁能告诉我在JavaScript事件中的currentTarget和target属性的确切区别,以及哪个属性在哪个场景中使用?


当前回答

对于泡沫属性为真的事件,它们会冒泡。

大多数事件都冒泡,除了几个,即焦点,模糊,鼠标进入,鼠标离开,…

如果事件evt冒泡,则evt。currentttarget被更改为其冒泡路径中的当前目标,而evt。目标保持与触发事件的原始目标相同的值。

值得注意的是,如果您的事件处理程序(冒泡事件的)是异步的,并且处理程序使用event . currenttarget。currentTarget应该在本地缓存,因为事件对象在冒泡链中被重用(代码依赖)。

const clickHandler = evt => {
  const {currentTarget} = evt // cache property locally
  setTimeout(() => {
    console.log('evt.currentTarget changed', evt.currentTarget !== currentTarget)
  }, 3000)
}

如果你使用React,从v17开始,React会删除事件池。

因此,事件对象在处理程序中被刷新,可以安全地用于异步调用(依赖于代码)。

并不总是正确的。onClick事件的currentTarget在事件处理程序结束后未定义。总之,如果要在同步调用之后使用事件的属性,请始终在本地缓存它们。

来自react文档

注意: 从v17开始,e.persist()不做任何事情,因为SyntheticEvent 不再被池化。

还有很多其他的东西太长了,不能贴在答案里,所以我总结了一下,在这里写了一篇博客。

其他回答

最小可运行示例

window.onload = function() { var resultElem = document.getElementById('result') document.getElementById('1').addEventListener( 'click', function(event) { resultElem.innerHTML += ('<div>target: ' + event.target.id + '</div>') resultElem.innerHTML += ('<div>currentTarget: ' + event.currentTarget.id + '</div>') }, false ) document.getElementById('2').dispatchEvent( new Event('click', { bubbles:true })) } <div id="1">1 click me <div id="2">2 click me as well</div> </div> <div id="result"> <div>result:</div> </div>

如果你点击:

2 click me as well

然后1监听它,并在结果后面追加:

target: 2
currentTarget: 1

因为在这种情况下:

2是引发事件的元素 1是监听事件的元素

如果你点击:

1 click me

相反,结果是:

target: 1
currentTarget: 1

铬71测试。

默认情况下,事件冒泡。所以两者的区别是:

目标是触发事件的元素(例如,用户点击) currentTarget是事件监听器附加到的元素。

事件。目标是事件产生的节点,即。无论您将事件侦听器放置在何处(在段落或span上),事件。目标指的是节点(用户单击的地方)。

事件。相反,currentarget指向附加了当前事件监听器的节点。Ie。如果将事件监听器附加在段落节点上,则event。currentarget指向段落while事件。目标仍然指向span。 注意:如果我们在body上也有一个事件监听器,那么对于这个事件监听器,事件。currentTarget指的是body(即。作为事件监听器的输入提供的事件在每次事件冒泡一个节点时更新)。

一个实验:

document.addEventListener("click", (e) => {
  console.log(e.target, e.currentTarget);
});
document.querySelector("p").click();

输出:

<p></p>
#document

target (<p></p>)似乎是被点击的元素,而currentTarget (#document)是监听点击事件的元素。

对于泡沫属性为真的事件,它们会冒泡。

大多数事件都冒泡,除了几个,即焦点,模糊,鼠标进入,鼠标离开,…

如果事件evt冒泡,则evt。currentttarget被更改为其冒泡路径中的当前目标,而evt。目标保持与触发事件的原始目标相同的值。

值得注意的是,如果您的事件处理程序(冒泡事件的)是异步的,并且处理程序使用event . currenttarget。currentTarget应该在本地缓存,因为事件对象在冒泡链中被重用(代码依赖)。

const clickHandler = evt => {
  const {currentTarget} = evt // cache property locally
  setTimeout(() => {
    console.log('evt.currentTarget changed', evt.currentTarget !== currentTarget)
  }, 3000)
}

如果你使用React,从v17开始,React会删除事件池。

因此,事件对象在处理程序中被刷新,可以安全地用于异步调用(依赖于代码)。

并不总是正确的。onClick事件的currentTarget在事件处理程序结束后未定义。总之,如果要在同步调用之后使用事件的属性,请始终在本地缓存它们。

来自react文档

注意: 从v17开始,e.persist()不做任何事情,因为SyntheticEvent 不再被池化。

还有很多其他的东西太长了,不能贴在答案里,所以我总结了一下,在这里写了一篇博客。