javascript中currentTarget属性和target属性之间的确切区别是什么?

Val*_*i69 206 javascript

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

Gri*_*fin 293

基本上,事件默认为泡沫,因此两者之间的差异是:

  • target 是触发事件的元素(例如,用户点击)
  • currentTarget 是事件侦听器附加到的元素.

请参阅此博客文章中的简单说明.

  • target =触发事件的元素; currentTarget =侦听事件的元素. (93认同)
  • @markmarijnissen,Elements 触发了一个事件,他们不听。我们只是分配处理程序来执行它,当它发生时。currentTarget 是附加事件处理程序的对象。 (5认同)
  • @markmarijnissen 您绝对应该将您的评论作为答案,因为它比上面的答案更有用,而且投票率也更高! (4认同)

mar*_*sen 57

target =触发事件的元素.

currentTarget =侦听事件的元素.

  • @Samathingamajig 因为你**向** HTML 元素添加**一个事件侦听器。它不是监听的元素,而是浏览器提供的 Web-Api 中的监听器。 (3认同)
  • 元素触发事件,但不监听。我们只是分配处理程序以在发生时执行它。currentTarget是事件处理程序的附加对象。 (2认同)

Cir*_*四事件 15

最小的可运行示例

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 }))
}
Run Code Online (Sandbox Code Playgroud)
<div id="1">1 click me
  <div id="2">2 click me as well</div>
</div>
<div id="result">
  <div>result:</div>
</div>
Run Code Online (Sandbox Code Playgroud)

如果你点击:

2 click me as well
Run Code Online (Sandbox Code Playgroud)

然后1听取它,并追加到结果:

target: 2
currentTarget: 1
Run Code Online (Sandbox Code Playgroud)

因为在那种情况下:

  • 2 是发起事件的元素
  • 1 是听取事件的元素

如果你点击:

1 click me
Run Code Online (Sandbox Code Playgroud)

相反,结果是:

target: 1
currentTarget: 1
Run Code Online (Sandbox Code Playgroud)

在铬71上测试.

  • 感谢您通过示例进行解释。 (2认同)

use*_*937 13

如果这不坚持,试试这个:

current in currentTarget指的是现在.这是最近发现从其他地方冒出来的事件的目标.

  • 从冒泡阶段的角度来看这个问题是很有用的。我最初的猜测是“currentTarget”指的是触发事件的元素,因为“current”意味着可变性,并且它是可以在事件之间发生变化的触发对象。 (3认同)

Som*_*rma 10

<style>
  body * {
    margin: 10px;
    border: 1px solid blue;
  }
</style>

<form onclick="alert('form')">FORM
  <div onclick="alert('div')">DIV
    <p onclick="alert('p')">P</p>
  </div>
</form>
Run Code Online (Sandbox Code Playgroud)

如果点击上面代码中的 P 标签,你会得到三个警告,如果你点击 div 标签,你会得到两个警告和一个点击表单标签的警告。现在看下面的代码,

<style>
  body * {
    margin: 10px;
    border: 1px solid blue;
  }
</style>
<script>
function fun(event){
  alert(event.target+" "+event.currentTarget);
}

</script>

<form>FORM
  <div onclick="fun(event)">DIV
    <p>P</p>
  </div>
</form>
Run Code Online (Sandbox Code Playgroud)
我们刚刚从 P 和表单标签中删除了 onclick,现在当我们点击 P 标签时,我们只会收到一个警报:

[对象 HTMLParagraphElement] [对象 HTMLDivElement]

这里 event.target 是 [object HTMLParagraphElement],而 event.curentTarget 是 [object HTMLDivElement]: 所以

event.target 是发起事件的节点,而 event.currentTarget 则相反,指的是当前事件监听器所在的节点。要了解更多信息,请参阅冒泡

在这里,我们点击了 P 标签,但我们在 P 上没有监听器,而是在它的父元素 div 上。

  • 我认为这是一个很好的例子。它让我头脑清醒 (3认同)

tra*_*ang 10

对于那些事件的气泡true,他们的泡沫。

大多数事件都会冒泡,除了几个,即focus , blur , mouseenter , mouseleave , ...

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

事件的目标类型

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

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

如果您使用 React,从 v17 开始,react 会删除Event Pooling

因此,事件对象在处理程序中刷新并且可以安全地用于异步调用 ( codepen )。

? 并非总是如此。onClick事件currentTargetundefined在事件处理程序完成之后。总之,如果您打算在同步调用后使用它们,请始终在本地缓存事件的属性。

来自反应文档

笔记:

从 v17 开始, e.persist() 不会做任何事情,因为 SyntheticEvent 不再被合并。

以及很多其他的太长的东西无法粘贴在一个答案中,所以我在这里总结并发了一篇博文


Nat*_*lie 10

Event.currentTarget已附加事件处理程序的元素,而不是Event.target,它标识发生事件的元素并且可能是其后代元素

来源:MDN

target始终引用前面的元素addEventListener- 它是事件起源的元素。 currentTarget告诉您 - 如果这是一个正在冒泡的事件 - 当前附加了事件侦听器的元素(如果事件发生,它将触发事件处理程序)。

请参阅此 CodePen的示例。如果您打开开发人员工具并单击正方形,您将看到首先 div 是目标和 currentTarget,但事件冒泡到主元素 - 然后主元素成为 currentTarget,而 div 仍然是目标。请注意,事件侦听器需要附加到两个元素才能发生冒泡。


Yog*_*wat 5

event.target是事件起源的节点,即。无论您将事件侦听器放置在何处(在段落或跨度上), event.target 都是指节点(用户单击的位置)。

event.currentTarget则相反,指的是当前事件侦听器所在的节点。IE。如果我们在段落节点上附加我们的事件侦听器,那么 event.currentTarget 指的是段落,而 event.target 仍然指的是跨度。注意:如果我们在 body 上也有一个事件监听器,那么对于这个事件监听器, event.currentTarget 指的是 body(即,作为输入提供给事件监听器的事件在每次事件冒泡一个节点时更新)。

  • 对于访问此页面的任何人来说,这个答案是错误的!检查已接受的答案!这件事应该被遗忘。delegateTarget 是指事件附加位置的节点。 (2认同)