ตามลำดับเหตุการณ์ DOM: CAPTURING vs BUBBLING
มีสองขั้นตอนในการเผยแพร่เหตุการณ์ เหล่านี้เรียกว่า"จับ"และ"ฟอง"
| | / \
---------------| |----------------- ---------------| |-----------------
| element1 | | | | element1 | | |
| -----------| |----------- | | -----------| |----------- |
| |element2 \ / | | | |element2 | | | |
| ------------------------- | | ------------------------- |
| Event CAPTURING | | Event BUBBLING |
----------------------------------- -----------------------------------
ขั้นตอนการจับภาพจะเกิดขึ้นก่อนแล้วตามด้วยขั้นตอนที่มีฟอง เมื่อคุณลงทะเบียนเหตุการณ์โดยใช้ DOM api ปกติเหตุการณ์จะเป็นส่วนหนึ่งของขั้นตอนการเดือดตามค่าเริ่มต้น แต่สามารถระบุได้เมื่อสร้างเหตุการณ์
// CAPTURING event
button.addEventListener('click', handleClick, true)
// BUBBLING events
button.addEventListener('click', handleClick, false)
button.addEventListener('click', handleClick)
ในการตอบสนองเหตุการณ์ที่มีฟองยังเป็นสิ่งที่คุณใช้โดยค่าเริ่มต้น
// handleClick is a BUBBLING (synthetic) event
<button onClick={handleClick}></button>
// handleClick is a CAPTURING (synthetic) event
<button onClickCapture={handleClick}></button>
ลองมาดูในที่จับของเราคลิกโทรกลับ (ตอบสนอง):
function handleClick(e) {
// This will prevent any synthetic events from firing after this one
e.stopPropagation()
}
function handleClick(e) {
// This will set e.defaultPrevented to true
// (for all synthetic events firing after this one)
e.preventDefault()
}
ทางเลือกที่ฉันไม่เคยเห็นมาก่อน
หากคุณเรียกใช้ e.preventDefault () ในกิจกรรมทั้งหมดของคุณคุณสามารถตรวจสอบว่าเหตุการณ์ได้รับการจัดการหรือไม่และป้องกันไม่ให้จัดการอีกครั้ง:
handleEvent(e) {
if (e.defaultPrevented) return // Exits here if event has been handled
e.preventDefault()
// Perform whatever you need to here.
}
สำหรับความแตกต่างระหว่างเหตุการณ์สังเคราะห์และเหตุการณ์เนทีฟโปรดดูเอกสาร React: https://reactjs.org/docs/events.html