Яка точна різниця між властивістю currentTarget та властивістю target у JavaScript


289

Може хто-небудь, будь ласка, скажіть мені точну різницю між властивістю currentTargetта targetподіями у подіях Javascript із прикладом та якою властивістю використовується в якому сценарії?


Його важлива esp, оскільки деякі браузери мають різні підходи, наприклад, якщо ви слухаєте подію копіювання div, у FF ви отримаєте textNode замість елемента, але слухач буде на рівні div.
Нікос

Відповіді:


401

В основному, події міхур за замовчуванням, тому різниця між ними:

  • target це елемент, який викликав подію (наприклад, користувач натиснув на)
  • currentTarget є елементом, до якого приєднаний слухач подій.

Дивіться просте пояснення в цій публікації в блозі .


111
target = елемент, який викликав подію; currentTarget = елемент, який слухає подію.
markmarijnissen

2
@markmarijnissen Ви обов'язково повинні залишити свій коментар як відповідь, оскільки це корисніше, ніж відповідь вище, та ще більше проголосували!
Андреа

Чи можете ви, будь ласка, оновити свою відповідь на цей коментар
Рахіль Вазір

подумайте про currentTarget як "вказанийTarget"
craigmichaelmartin

Це не завжди елемент. наприкладXMLHttpRequest
Кну

77

target = елемент, який викликав подію.

currentTarget = елемент, який містить слухача події.


3
Елементи розпалюють подію, вони її не слухають. Ми просто призначаємо обробник для його виконання, коли він виникає. currentTarget - це той, де додається обробник подій.
Самяк Джайн

23

Приклад мінімальної експлуатації

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

Випробуваний на Chromium 71.


18

Якщо це не прилипає, спробуйте це:

Струм у відносинах currentTargetдо сьогодення. Це найновіша ціль, яка спіймала подію, яка вибухнула з інших місць.


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>

Якщо натиснути на тег 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>
Ми щойно видалили onclick з тегу P та form, і тепер, коли натискаємо на тег P, ми отримуємо лише одне попередження:

[об’єкт HTMLParagraphElement] [об’єкт HTMLDivElement]

Тут event.target є [об’єкт HTMLParagraphElement], а event.curentTarget - [об’єкт HTMLDivElement]:

event.target є вузлом , з якого виникло подія, і event.currentTarget, навпаки, відноситься до вузла , на якому ток-подія слухача був attached.To дізнатися більше см барботирования

Тут ми натиснули тег P, але у нас немає слухача P, а його батьківського елемента div.


2

event.target - це вузол, з якого подія виникла, тобто де б ви не розмістили слухача події (на абзац або проміжок), event.target посилається на вузол (де користувач натиснув).

event.currentTarget , навпаки, посилається на вузол, до якого був приєднаний слухач поточних подій. Тобто якщо ми приєднали нашого слухача подій до вузла абзацу, то event.currentTarget посилається на абзац, тоді як event.target все ще посилається на проміжок. Зауважте: якщо у нас також є слухач подій на тілі, то для цього слухача подій event.currentTarget посилається на тіло (тобто подія, надана як вхід для подій, що оновлюються, щоразу оновлюється кожного разу, коли подія перекидається одним вузлом вгору).


Для всіх, хто відвідує цю сторінку, ця відповідь невірна !! Перевірте прийняту відповідь! Цю річ слід привертати до забуття. delegateTarget - це вузол, який посилається на те, де подія була прикріплена.
LittleTreeX
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.