Qual é a diferença exata entre a propriedade currentTarget e a propriedade target em javascript

289

Alguém pode me dizer a diferença exata entre currentTargete targetpropriedade nos eventos Javascript com exemplo e qual propriedade é usada em qual cenário?

Valli69
fonte
É importante porque alguns navegadores têm abordagens diferentes, por exemplo, se você ouvir um evento de cópia div, no FF você receberá um textNode em vez de um elemento, mas o ouvinte estará no nível div.
Nikos

Respostas:

401

Basicamente, os eventos borbulham por padrão, portanto a diferença entre os dois é:

  • target é o elemento que acionou o evento (por exemplo, o usuário clicou)
  • currentTarget é o elemento ao qual o ouvinte de evento está anexado.

Veja uma explicação simples nesta postagem do blog .

Griffin
fonte
111
target = elemento que acionou o evento; currentTarget = elemento que escuta o evento.
Markmarijnissen
2
@markmarijnissen Você definitivamente deve colocar seu comentário como resposta, já que é mais útil do que a resposta acima e mais votado também!
Andrea
Você pode, por favor, atualizar sua resposta por este comentário
Rahil Wazir
pense em currentTarget como "
selectedTarget
Nem sempre é um elemento. por exemploXMLHttpRequest
Knu 28/07
77

target = elemento que acionou o evento.

currentTarget = elemento que possui o ouvinte de evento.

markmarijnissen
fonte
3
Elementos disparam um evento, eles não o ouvem. Nós apenas atribuímos o manipulador para executá-lo, quando ocorrer. currentTarget é aquele em que o manipulador de eventos foi anexado.
Samyak Jain
23

Exemplo mínimo executável

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>

Se você clicar em:

2 click me as well

então 1ouve e anexa ao resultado:

target: 2
currentTarget: 1

porque nesse caso:

  • 2 é o elemento que originou o evento
  • 1 é o elemento que ouviu o evento

Se você clicar em:

1 click me

em vez disso, o resultado é:

target: 1
currentTarget: 1

Testado no Chromium 71.

Ciro Santilli adicionou uma nova foto
fonte
18

Se isso não persistir, tente o seguinte:

corrente em currentTargetrefere-se ao presente. É o alvo mais recente que capturou o evento que borbulhou de outros lugares.

user1164937
fonte
5

<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>

Se clicar na tag P no código acima, você receberá três alertas e, se clicar na tag div, receberá dois alertas e um único alerta ao clicar na tag do formulário. E agora veja o código a seguir,

<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>
Acabamos de remover o onclick da tag P e do formulário e agora, quando clicamos na tag P, obtemos apenas um alerta:

[objeto HTMLParagraphElement] [objeto HTMLDivElement]

Aqui event.target é [objeto HTMLParagraphElement] e event.curentTarget é [objeto HTMLDivElement]: Então

event.target é o nó do qual o evento se originou e event.currentTarget, pelo contrário, refere-se ao nó no qual o ouvinte de evento atual foi anexado. Para saber mais, consulte bubbling

Aqui clicamos na tag P, mas não temos ouvinte em P, mas no elemento pai div.

Somesh Sharma
fonte
2

event.target é o nó do qual o evento se originou, ou seja. onde quer que você coloque seu ouvinte de evento (no parágrafo ou período), event.target se refere ao nó (onde o usuário clicou).

event.currentTarget , pelo contrário, refere-se ao nó no qual o ouvinte de evento atual foi anexado. Ou seja. se anexamos nosso ouvinte de evento no nó do parágrafo, event.currentTarget se refere ao parágrafo enquanto event.target ainda se refere à extensão. Nota: se também tivermos um ouvinte de evento no corpo, para este ouvinte de evento, event.currentTarget se refere ao corpo (ou seja, o evento fornecido como entrada para os listerners de eventos é atualizado sempre que um evento estiver borbulhando em um nó).

YogeshBagdawat
fonte
Para quem visita esta página, esta resposta está incorreta !! Verifique a resposta aceita! Essa coisa deve ser votada no esquecimento. delegateTarget é o nó que se refere ao local em que o evento foi anexado.
LittleTreeX