ความแตกต่างที่แน่นอนระหว่างคุณสมบัติ currentTarget และคุณสมบัติเป้าหมายในจาวาสคริปต์คืออะไร


289

ใครช่วยเล่าความแตกต่างที่แน่นอนระหว่างcurrentTargetและtargetคุณสมบัติในเหตุการณ์ Javascript ด้วยตัวอย่างและคุณสมบัติที่ใช้ในสถานการณ์ใดได้บ้าง


สาเหตุสำคัญของมันคือเบราว์เซอร์บางตัวมีวิธีการที่แตกต่างกันเช่นถ้าคุณฟังเหตุการณ์การคัดลอก div ใน FF คุณจะได้รับ textNode แทนองค์ประกอบ แต่ผู้ฟังจะอยู่ในระดับ div
Nikos

คำตอบ:


401

โดยทั่วไปแล้วเหตุการณ์ที่เกิดขึ้นจะทำให้เกิดฟองโดยค่าเริ่มต้นดังนั้นความแตกต่างระหว่างทั้งสองคือ:

  • target เป็นองค์ประกอบที่ทำให้เกิดเหตุการณ์ (เช่นผู้ใช้คลิก)
  • currentTarget เป็นองค์ประกอบที่แนบเหตุการณ์ฟัง

ดูคำอธิบายง่ายๆเกี่ยวกับการโพสต์บล็อกนี้


111
องค์ประกอบ = เป้าหมายที่ก่อให้เกิดเหตุการณ์; currentTarget = องค์ประกอบที่ฟังเหตุการณ์
markmarijnissen

2
@markmarijnissen คุณควรใส่ความคิดเห็นของคุณเป็นคำตอบเพราะมันมีประโยชน์มากกว่าคำตอบข้างต้นและยังโหวตให้อีกด้วย!
Andrea

คุณช่วยกรุณาอัปเดตคำตอบของคุณต่อความคิดเห็นนี้ได้
ไหม

คิดว่าเป้าหมายปัจจุบันเป็น "ระบุเป้าหมาย"
craigmichaelmartin

มันไม่ใช่องค์ประกอบเสมอไป เช่นXMLHttpRequest
Knu

77

target = องค์ประกอบที่เรียกใช้เหตุการณ์

currentTarget = องค์ประกอบที่มีฟังเหตุการณ์


3
องค์ประกอบไฟเหตุการณ์พวกเขาไม่ฟัง เราเพิ่งกำหนดตัวจัดการเพื่อดำเนินการเมื่อมันเกิดขึ้น currentTarget เป็นสิ่งที่แนบมากับตัวจัดการเหตุการณ์
Samyak Jain

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 และแบบฟอร์มและตอนนี้เมื่อเราคลิกที่ P แท็กเราจะได้รับการแจ้งเตือนเพียงครั้งเดียว:

[วัตถุ HTMLParagraphElement] [วัตถุ HTMLDivElement]

นี่คือ event.target คือ [object HTMLParagraphElement] และ event.curentTarget คือ [object HTMLDivElement]: ดังนั้น

event.target เป็นโหนดที่เหตุการณ์เกิดขึ้นและ event.currentTarget ตรงกันข้ามหมายถึงโหนดที่มีการแนบ listener เหตุการณ์ปัจจุบันไว้หากต้องการทราบเพิ่มเติมดู bubbling

ที่นี่เราคลิกที่แท็ก P แต่เราไม่มีฟังบน P แต่ในองค์ประกอบหลักของ div


2

event.targetเป็นโหนดที่เกิดเหตุการณ์ขึ้นเช่น ทุกที่ที่คุณวางฟังเหตุการณ์ของคุณ (ในย่อหน้าหรือช่วง), event.target หมายถึงโหนด (ที่ผู้ใช้คลิก)

event.currentTargetตรงกันข้ามอ้างถึงโหนดที่ฟังเหตุการณ์ปัจจุบันถูกแนบ กล่าวคือ ถ้าเราแนบ listener เหตุการณ์ของเราบนโหนด node แล้ว event.currentTarget อ้างถึงย่อหน้าในขณะที่ event.target ยังคงอ้างอิงถึง span หมายเหตุ: หากเรามีผู้ฟังเหตุการณ์ในเนื้อหาดังนั้นสำหรับ event-listener นี้ event.currentTarget อ้างถึงเนื้อหา (เช่นเหตุการณ์ที่ให้ไว้เป็นอินพุตไปยัง event-listerners จะอัปเดตแต่ละครั้งที่เหตุการณ์เกิดขึ้นหนึ่งโหนด)


สำหรับผู้ที่เข้าชมหน้านี้คำตอบนี้ไม่ถูกต้อง !! ตรวจสอบคำตอบที่ยอมรับ! สิ่งนี้ควรถูกลดระดับลงในการให้อภัย delegateTarget เป็นโหนดที่อ้างถึงตำแหน่งที่แนบเหตุการณ์
LittleTreeX
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.