Qual è la differenza esatta tra la proprietà currentTarget e la proprietà target in javascript


290

Qualcuno può dirmi la differenza esatta tra currentTarget e targetproprietà negli eventi Javascript con esempio e quale proprietà viene utilizzata in quale scenario?


È importante perché alcuni browser hanno approcci diversi, ad esempio se ascolti un evento di copia div, in FF otterrai un textNode anziché un elemento, ma l'ascoltatore sarà a livello div.
Nikos,

Risposte:


405

Fondamentalmente, gli eventi si gonfiano per impostazione predefinita, quindi la differenza tra i due è:

  • target è l'elemento che ha attivato l'evento (ad esempio, l'utente ha fatto clic su)
  • currentTarget è l'elemento a cui è collegato il listener di eventi.

Vedi una semplice spiegazione su questo post del blog .


111
target = elemento che ha attivato l'evento; currentTarget = elemento che ascolta l'evento.
markmarijnissen,

2
@markmarijnissen Dovresti assolutamente mettere il tuo commento come una risposta poiché è più utile della risposta sopra e anche più votato!
Andrea,

Potete per favore aggiornare la vostra risposta per questo commento
Rahil Wazir,

pensa a CurrentTarget come "specificatoTarget"
craigmichaelmartin il

Non è sempre un elemento. ad es.XMLHttpRequest
Knu,

77

target = elemento che ha attivato l'evento.

currentTarget = elemento che ha il listener di eventi.


3
Gli elementi generano un evento, non lo ascoltano. Assegniamo il gestore per eseguirlo, quando si verifica. currentTarget è quello a cui è stato associato il gestore eventi.
Samyak Jain,

23

Esempio eseguibile minimo

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 fai clic su:

2 click me as well

quindi lo 1ascolta e aggiunge il risultato:

target: 2
currentTarget: 1

perché in quel caso:

  • 2 è l'elemento che ha originato l'evento
  • 1 è l'elemento che ha ascoltato l'evento

Se fai clic su:

1 click me

invece, il risultato è:

target: 1
currentTarget: 1

Testato su Chromium 71.


18

Se questo non si attacca, prova questo:

corrente in si currentTargetriferisce al presente. È l'obiettivo più recente che ha catturato l'evento che è scoppiato altrove.


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 fai clic sul tag P nel codice sopra, otterrai tre avvisi e se fai clic sul tag div otterrai due avvisi e un singolo avviso facendo clic sul tag del modulo. E ora vedi il seguente codice,

<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>
Abbiamo appena rimosso onclick dal tag P e form e ora quando facciamo clic sul tag P riceviamo un solo avviso:

[oggetto HTMLParagraphElement] [oggetto HTMLDivElement]

Qui event.target è [oggetto HTMLParagraphElement] e event.curentTarget è [oggetto HTMLDivElement]: So

event.target è il nodo da cui ha avuto origine l'evento, e event.currentTarget, al contrario, si riferisce al nodo a cui era collegato il listener di eventi corrente. Per saperne di più, vedi bubbling

Qui abbiamo cliccato sul tag P ma non abbiamo ascoltatore su P ma sul div dell'elemento genitore.


3

event.target è il nodo da cui ha avuto origine l'evento, ad es. ovunque posizioniate il listener di eventi (su paragrafo o span), event.target si riferisce al nodo (dove l'utente ha fatto clic).

event.currentTarget , al contrario, si riferisce al nodo a cui era collegato il listener di eventi correnti. Vale a dire. se abbiamo collegato il nostro listener di eventi sul nodo del paragrafo, allora event.currentTarget si riferisce al paragrafo mentre event.target si riferisce ancora allo span. Nota: se abbiamo anche un listener di eventi sul corpo, allora per questo listener di eventi, event.currentTarget si riferisce al corpo (cioè l'evento fornito come input per gli ascoltatori di eventi viene aggiornato ogni volta che l'evento fa gorgogliare un nodo).


Per chiunque visiti questa pagina, questa risposta non è corretta !! Controlla la risposta accettata! Questa cosa dovrebbe essere votata all'oblio. delegateTarget è il nodo che fa riferimento al punto in cui è stato associato l'evento.
LittleTreeX,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.