Apa perbedaan persis antara properti currentTarget dan properti target dalam javascript


289

Adakah yang bisa tolong beri tahu saya perbedaan persis antara currentTargetdan targetproperti dalam peristiwa Javascript dengan contoh dan properti mana yang digunakan dalam skenario mana?


Terutama penting karena beberapa browser memiliki pendekatan yang berbeda, misalnya jika Anda mendengarkan acara copy div, dalam FF Anda akan mendapatkan textNode, bukan elemen, tetapi pendengar akan berada di level div.
Nikos

Jawaban:


401

Pada dasarnya, peristiwa menggelembung secara default sehingga perbedaan antara keduanya adalah:

  • target adalah elemen yang memicu acara (misalnya, pengguna mengklik)
  • currentTarget adalah elemen yang dilampirkan oleh pendengar acara.

Lihat penjelasan sederhana di posting blog ini .


111
target = elemen yang memicu acara; currentTarget = elemen yang mendengarkan acara.
markmarijnissen

2
@markmarijnissen Anda harus meletakkan komentar sebagai jawaban karena lebih bermanfaat daripada jawaban di atas dan lebih banyak suara juga!
Andrea

Bisakah Anda memperbarui jawaban Anda per komentar ini
Rahil Wazir

pikirkan currentTarget sebagai "ditentukanTarget"
craigmichaelmartin

Itu tidak selalu merupakan elemen. misalnyaXMLHttpRequest
Knu

77

target = elemen yang memicu acara.

currentTarget = elemen yang memiliki pendengar acara.


3
Elemen menembakkan suatu peristiwa, mereka tidak mendengarkannya. Kami hanya menetapkan penangan untuk menjalankannya, ketika itu terjadi. currentTarget adalah tempat di mana event handler dilampirkan.
Samyak Jain

23

Contoh runnable minimal

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>

Jika Anda mengklik:

2 click me as well

kemudian 1dengarkan itu, dan tambahkan hasilnya:

target: 2
currentTarget: 1

karena dalam hal itu:

  • 2 adalah elemen yang memulai acara
  • 1 adalah elemen yang mendengarkan acara tersebut

Jika Anda mengklik:

1 click me

sebagai gantinya, hasilnya adalah:

target: 1
currentTarget: 1

Diuji pada Chromium 71.


18

Jika ini tidak lengket, coba ini:

saat ini di currentTargetmengacu pada saat ini. Itu target terbaru yang menangkap peristiwa yang menggelegak dari tempat lain.


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>

Jika klik pada tag P dalam kode di atas maka Anda akan mendapatkan tiga peringatan, dan jika Anda mengklik tag div Anda akan mendapatkan dua peringatan dan satu peringatan tunggal pada mengklik tag formulir. Dan sekarang lihat kode berikut,

<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>
Kami baru saja menghapus onclick dari tag P dan form dan sekarang ketika kita mengklik kita pada tag P kita hanya mendapatkan satu peringatan:

[objek HTMLParagraphElement] [objek HTMLDivElement]

Di sini event.target adalah [objek HTMLParagraphElement], dan event.curentTarget adalah [objek HTMLDivElement]: Jadi

event.target adalah simpul dari mana peristiwa itu berasal, dan event.currentTarget, sebaliknya, mengacu pada simpul di mana pendengar peristiwa saat ini dilampirkan. Untuk tahu lebih banyak lihat menggelegak

Di sini kita mengklik pada tag P tetapi kita tidak memiliki pendengar pada P tetapi pada div elemen induknya.


2

event.target adalah simpul dari mana peristiwa itu berasal, yaitu. dimanapun Anda menempatkan pendengar acara Anda (pada paragraf atau rentang), event.target merujuk ke simpul (tempat pengguna mengklik).

event.currentTarget , sebaliknya, mengacu pada simpul tempat pendengar kejadian saat ini dilampirkan. Yaitu. jika kita melampirkan pendengar acara kami pada node paragraf, maka event.currentTarget merujuk ke paragraf sementara event.target masih mengacu pada span. Catatan: bahwa jika kita juga memiliki pendengar acara di badan, maka untuk acara-pendengar ini, event.currentTarget merujuk ke tubuh (mis. Acara yang disediakan sebagai masukan untuk event-listerners diperbarui setiap kali acara menggelegak satu simpul ke atas).


Bagi siapa pun yang mengunjungi halaman ini, jawaban ini salah !! Periksa jawaban yang diterima! Hal ini harus diturunkan menjadi terlupakan. delegateTarget adalah simpul yang merujuk ke tempat acara itu dilampirkan.
LittleTreeX
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.