คำศัพท์
จากquirksmode.org :
การจับภาพเหตุการณ์
เมื่อคุณใช้การจับภาพเหตุการณ์
| |
--------------- | | -----------------
| องค์ประกอบ 1 | | |
| ----------- | | ----------- |
| | element2 \ / | |
| ------------------------- |
| การจัดกิจกรรม
-----------------------------------
ตัวจัดการเหตุการณ์ของ element1 ยิงก่อนตัวจัดการเหตุการณ์ขององค์ประกอบ 2 จะยิงครั้งสุดท้าย
เหตุการณ์เดือดปุด ๆ
เมื่อคุณใช้เดือดปุด ๆ เหตุการณ์
/ \
--------------- | | -----------------
| องค์ประกอบ 1 | | |
| ----------- | | ----------- |
| | element2 | | | |
| ------------------------- |
| BUBBLING ของกิจกรรม
-----------------------------------
ตัวจัดการเหตุการณ์ขององค์ประกอบ 2 ยิงก่อนตัวจัดการเหตุการณ์ขององค์ประกอบ 1 จะยิงครั้งสุดท้าย
เหตุการณ์ใด ๆ ที่เกิดขึ้นในแบบจำลองเหตุการณ์ W3C ถูกจับครั้งแรกจนกว่าจะถึงองค์ประกอบเป้าหมายแล้วฟองอากาศขึ้นมาอีกครั้ง
| | / \
----------------- | | - | | -----------------
| องค์ประกอบ 1 | | | | |
| ------------- | | - | | ----------- |
| | element2 \ / | | | |
| -------------------------------- |
| รูปแบบเหตุการณ์ W3C
------------------------------------------
อินเตอร์เฟซ
จากw3.orgเพื่อจับภาพเหตุการณ์ :
หากการจับภาพEventListener
ประสงค์ที่จะป้องกันไม่ให้มีการดำเนินการกับเหตุการณ์เพิ่มเติมอาจเรียกstopPropagation
วิธีการ
Event
อินเทอร์เฟซ วิธีนี้จะป้องกันการส่งต่อเหตุการณ์แม้ว่าการEventListeners
ลงทะเบียนเพิ่มเติมในระดับลำดับชั้นเดียวกันจะยังคงได้รับเหตุการณ์ เมื่อstopPropagation
มีการเรียกใช้เมธอดของกิจกรรมแล้วการโทรไปยังเมธอดนั้นจะไม่มีผลเพิ่มเติม หากไม่มีผู้จับกุมเพิ่มเติมและ
stopPropagation
ไม่ได้ถูกเรียกเหตุการณ์จะทำให้เกิดความเหมาะสมEventListeners
กับเป้าหมาย
สำหรับเหตุการณ์เดือดปุด ๆ :
ตัวจัดการเหตุการณ์ใด ๆ อาจเลือกที่จะป้องกันการเผยแพร่เหตุการณ์ต่อไปโดยการเรียกstopPropagation
วิธีการของEvent
อินเทอร์เฟซ หากมีการ
EventListener
เรียกวิธีนี้จะมีการเรียกใช้เพิ่มเติมทั้งหมดEventListeners
ในปัจจุบันEventTarget
แต่การหยุดเดือดจะหยุดในระดับนั้น stopPropagation
ต้องใช้การโทรเพียงครั้งเดียวเพื่อป้องกันการเดือดปุด ๆ
สำหรับการยกเลิกกิจกรรม :
ยกเลิกสามารถทำได้โดยการเรียกEvent
's preventDefault
วิธี หากมีการEventListeners
โทรหนึ่งครั้งขึ้นไปpreventDefault
ในระหว่างขั้นตอนการไหลของเหตุการณ์การกระทำเริ่มต้นจะถูกยกเลิก
ตัวอย่าง
ในตัวอย่างต่อไปนี้การคลิกที่การเชื่อมโยงหลายมิติในเว็บเบราว์เซอร์จะทำให้เกิดการไหลของเหตุการณ์ (ผู้ฟังเหตุการณ์จะถูกดำเนินการ) และการกระทำเริ่มต้นของเป้าหมายเหตุการณ์ (เปิดแท็บใหม่)
HTML:
<div id="a">
<a id="b" href="http://www.google.com/" target="_blank">Google</a>
</div>
<p id="c"></p>
JavaScript:
var el = document.getElementById("c");
function capturingOnClick1(ev) {
el.innerHTML += "DIV event capture<br>";
}
function capturingOnClick2(ev) {
el.innerHTML += "A event capture<br>";
}
function bubblingOnClick1(ev) {
el.innerHTML += "DIV event bubbling<br>";
}
function bubblingOnClick2(ev) {
el.innerHTML += "A event bubbling<br>";
}
// The 3rd parameter useCapture makes the event listener capturing (false by default)
document.getElementById("a").addEventListener("click", capturingOnClick1, true);
document.getElementById("b").addEventListener("click", capturingOnClick2, true);
document.getElementById("a").addEventListener("click", bubblingOnClick1, false);
document.getElementById("b").addEventListener("click", bubblingOnClick2, false);
ตัวอย่างที่ 1 : ผลลัพธ์ในผลลัพธ์
DIV event capture
A event capture
A event bubbling
DIV event bubbling
ตัวอย่างที่ 2 : การเพิ่มstopPropagation()
ไปยังฟังก์ชัน
function capturingOnClick1(ev) {
el.innerHTML += "DIV event capture<br>";
ev.stopPropagation();
}
ผลลัพธ์ในผลลัพธ์
DIV event capture
ผู้ฟังเหตุการณ์ป้องกันการเผยแพร่เหตุการณ์ลงและเพิ่มเติม อย่างไรก็ตามมันไม่ได้ป้องกันการกระทำเริ่มต้น (การเปิดแท็บใหม่)
ตัวอย่างที่ 3 : การเพิ่มstopPropagation()
ไปยังฟังก์ชัน
function capturingOnClick2(ev) {
el.innerHTML += "A event capture<br>";
ev.stopPropagation();
}
หรือฟังก์ชั่น
function bubblingOnClick2(ev) {
el.innerHTML += "A event bubbling<br>";
ev.stopPropagation();
}
ผลลัพธ์ในผลลัพธ์
DIV event capture
A event capture
A event bubbling
นี่เป็นเพราะทั้งสองฟังเหตุการณ์มีการลงทะเบียนในเป้าหมายเหตุการณ์เดียวกัน ตัวรับฟังเหตุการณ์ป้องกันการเผยแพร่เหตุการณ์ขึ้นไปอีก อย่างไรก็ตามพวกเขาไม่ได้ป้องกันการกระทำเริ่มต้น (การเปิดแท็บใหม่)
ตัวอย่างที่ 4 : การเพิ่มpreventDefault()
ไปยังฟังก์ชันใด ๆ ตัวอย่างเช่น
function capturingOnClick1(ev) {
el.innerHTML += "DIV event capture<br>";
ev.preventDefault();
}
ป้องกันแท็บใหม่ไม่ให้เปิด
event.stop
ฟังก์ชั่นของพวกเขา... นอกจากนี้แปลก ๆ ที่ฉันไม่เคยมีปัญหากับมัน ฉันใช้ฟองมาก ขอบคุณสำหรับตัวอย่าง!