ตรวจสอบตัวจัดการเหตุการณ์ที่แนบมาสำหรับองค์ประกอบ DOM ใด ๆ


107

มีวิธีใดในการดูว่าฟังก์ชัน / รหัสใดที่แนบมากับเหตุการณ์ใด ๆ สำหรับองค์ประกอบ DOM หรือไม่ ใช้ Firebug หรือเครื่องมืออื่น ๆ


แนบโดยใช้ jQuery หรือใช้ DOM ดั้งเดิม?
SLaks

3
@SLaks: คำถามที่ดี แนบโดยใช้กลไกใด ๆ
Claudio Redi

คำตอบ:


71

ตัวจัดการเหตุการณ์ที่แนบมาโดยใช้แบบดั้งเดิมelement.onclick= handlerหรือ HTML <element onclick="handler">สามารถเรียกดูได้เล็กน้อยจากelement.onclickคุณสมบัติจากสคริปต์หรือในโปรแกรมดีบั๊ก

ตัวจัดการเหตุการณ์ที่แนบมาโดยใช้วิธี DOM ระดับ 2 เหตุการณ์addEventListenerและ IE attachEventไม่สามารถดึงจากสคริปต์ได้ในขณะนี้ DOM ระดับ 3 เคยเสนอelement.eventListenerListให้รับฟังทุกคน แต่ยังไม่ชัดเจนว่าจะทำให้เป็นไปตามข้อกำหนดขั้นสุดท้ายหรือไม่ วันนี้ไม่มีการใช้งานในเบราว์เซอร์ใด ๆ

เครื่องมือดีบักเป็นส่วนขยายของเบราว์เซอร์สามารถเข้าถึงผู้ฟังประเภทนี้ได้ แต่ฉันไม่ทราบว่ามีอะไรบ้าง

เฟรมเวิร์ก JS บางตัวทิ้งบันทึกเหตุการณ์ที่เชื่อมโยงไว้มากพอที่จะหาสิ่งที่พวกเขาทำ Visual Eventใช้แนวทางนี้ในการค้นหาผู้ฟังที่ลงทะเบียนผ่านเฟรมเวิร์กยอดนิยมบางส่วน


7
ขณะนี้มีส่วนขยายสำหรับ Firebug ชื่อว่า EventBug และมีรายงานว่าเป็นคุณลักษณะที่คล้ายกันใน chrome / safari ฉันจะเชื่อมโยงไปยังการสนทนาที่ได้รับความนิยมมากขึ้นในเรื่องนี้stackoverflow.com/questions/446892/…
Nickolay

1
ใน Opera คุณสามารถใช้ Opera Dragonfly ในตัวได้
Norill Tempest

นอกจากนี้ยังมีในส่วนของ FireBug (ส่วนขยายสำหรับ FireFox) สำหรับเหตุการณ์เมื่อเลือกแท็ก HTML
Musa Haidari

EventBug ถูกรวมเข้ากับ FireBug ตั้งแต่เวอร์ชัน 2 (ตอนนี้มีแท็บ "เหตุการณ์")
Chris Rae

2
ตั้งแต่ Firefox 33, จัดการเหตุการณ์ที่แสดงอยู่ในการตรวจสอบสต็อก HTML
ivan_pozdeev

76

องค์ประกอบแผงในเครื่องมือสำหรับนักพัฒนา Google Chromeมีนี้ตั้งแต่รุ่น Chrome ในช่วงกลางเดือน 2011 และ Chrome รุ่นช่องนักพัฒนาซอฟต์แวร์ตั้งแต่ปี 2010

นอกจากนี้ตัวฟังเหตุการณ์ที่แสดงสำหรับโหนดที่เลือกจะอยู่ในลำดับที่พวกเขาถูกยิงผ่านขั้นตอนการจับภาพและการทำให้เกิดฟอง

ตีcommand+ option+ iบน Mac OSX และCtrl+ Shift+ iบน Windows ที่จะยิงนี้ขึ้นใน Chrome

ภาพหน้าจอเครื่องมือ dev


5
แผงองค์ประกอบใน Chrome ทำอย่างไร
Thunderboltz

1
นอกจากนี้เราจะค้นหารหัสที่กำหนดสิ่งเหล่านี้ได้อย่างไร เมื่อฉันพบตัวจัดการเหตุการณ์ที่ต้องสงสัยโดยใช้ UI นี้แถบไม่กว้างพอที่ฉันจะเห็นรหัสของตัวจัดการ ...
Steven Lu

ฉันพบว่าแนวทางนี้ค่อนข้างสับสน .. อย่างน้อยก็สำหรับฉัน เมื่อฉันเปิดเหตุการณ์มีเพียงเหตุการณ์ jQuery เหตุการณ์ที่กำหนดเองของฉันสำหรับองค์ประกอบนั้นจะไม่แสดง ฉันใช้ $ ._ data สำหรับเหตุการณ์ที่กำหนดเองที่ฉันแนบกับ jQuery ดูstackoverflow.com/questions/2008592/…
stack247

2
เป็นไปได้ไหมที่จะตรวจสอบเหตุการณ์บนwindowวัตถุเช่นmessageเหตุการณ์
ก.ย.

8

Chrome Dev เครื่องมือเพิ่งประกาศเครื่องมือใหม่ ๆ บางอย่างสำหรับการตรวจสอบเหตุการณ์ JavaScript

TL; ดร

monitorEvents()ฟังเหตุการณ์บางประเภทใช้

ใช้unmonitorEvents()เพื่อหยุดฟัง

รับฟังขององค์ประกอบ DOM getEventListeners()โดยใช้

ใช้แผงตัวตรวจสอบผู้ฟังเหตุการณ์เพื่อรับข้อมูลเกี่ยวกับผู้ฟังเหตุการณ์

การค้นหาเหตุการณ์ที่กำหนดเอง

สำหรับความต้องการของฉันการค้นพบเหตุการณ์ JS ที่กำหนดเองในโค้ดของบุคคลที่สามสองเวอร์ชันต่อไปนี้getEventListeners()มีประโยชน์อย่างน่าอัศจรรย์

  • getEventListeners(window)
  • getEventListeners(document)

ถ้าคุณรู้ว่า DOM Node ฟังเหตุการณ์ที่ถูกแนบมากับคุณจะผ่านที่แทนหรือwindowdocument

เหตุการณ์ที่เป็นที่รู้จัก

ถ้าคุณรู้ว่าเหตุการณ์ที่คุณต้องการตรวจสอบเช่นในร่างกายของเอกสารที่คุณสามารถใช้ต่อไปนี้: clickmonitorEvents(document.body, 'click');

ตอนนี้คุณควรเริ่มเห็นเหตุการณ์การคลิกทั้งหมดในdocument.bodyการเข้าสู่ระบบในคอนโซล


ฉันได้ลองสิ่งนี้แล้วgetEventListeners (document.getElementById ("inputId")); แต่ผลตอบแทนไม่ถูกต้องโดยมีขนาดอาร์เรย์ 1
สีเขียวที่อุดมไปด้วย

6

คุณสามารถดูเหตุการณ์ที่แนบโดยตรง (element.onclick = handler) โดยดูที่ DOM คุณสามารถดูเหตุการณ์ที่แนบ jQuery ใน Firefox โดยใช้ FireBug กับ FireQuery ดูเหมือนจะไม่มีวิธีใดในการดูเหตุการณ์ที่เพิ่ม addEventListener โดยใช้ FireBug อย่างไรก็ตามคุณสามารถดูได้ใน Chrome โดยใช้โปรแกรมแก้ไขข้อบกพร่องของ Chrome


6

คุณสามารถใช้Visual Eventโดย Allan Jardine เพื่อตรวจสอบตัวจัดการเหตุการณ์ทั้งหมดที่แนบมาในปัจจุบันจากไลบรารี JavaScript หลัก ๆ บนเพจของคุณ ใช้งานได้กับ jQuery, YUI และอื่น ๆ อีกมากมาย

Visual Event เป็น bookmarklet JavaScript จึงเข้ากันได้กับเบราว์เซอร์หลัก ๆ ทั้งหมด


1

คุณสามารถขยายสภาพแวดล้อมจาวาสคริปต์ของคุณเพื่อติดตามผู้ฟังเหตุการณ์ Wrap (หรือ 'เกิน') เดอะ addEventListener พื้นเมือง () วิธีการที่มีรหัสบางอย่างที่กระป๋องเก็บบันทึกของผู้ฟังเหตุการณ์ใด ๆ เพิ่มจากนั้นเป็นต้น คุณยังต้องขยาย HTMLElement.prototype.removeEventListener เพื่อเก็บบันทึกที่สะท้อนสิ่งที่เกิดขึ้นใน DOM อย่างถูกต้อง

เพียงเพื่อประโยชน์ในการแสดงภาพประกอบ (โค้ดที่ยังไม่ทดสอบ) - นี่คือตัวอย่างของวิธีที่คุณจะ 'ตัด' addEventListener เพื่อให้มีบันทึกของผู้ฟังเหตุการณ์ที่ลงทะเบียนไว้ในวัตถุนั้นเอง:

var nativeMethod = HTMLElement.prototype.addEventListener;
HTMLElement.prototype.addEventListener = function (type, listener) {
   var el = e.currentTarget;
   if(!(el.eventListeners instanceof Array)) { el.eventListeners = []}
   el.eventListeners.push({'type':type, 'listener':listener});
   nativeMethod.call(el, type, listener);
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.