ฉันสามารถค้นหากิจกรรมที่ผูกไว้กับองค์ประกอบด้วย jQuery ได้หรือไม่


355

ฉันผูกตัวจัดการเหตุการณ์สองตัวที่ลิงค์นี้:

<a href='#' id='elm'>Show Alert</a>

JavaScript:

$(function()
{
  $('#elm').click(_f);
  $('#elm').mouseover(_m);
});

function _f(){alert('clicked');}
function _m(){alert('mouse over');}

มีวิธีที่จะได้รับรายชื่อของเหตุการณ์ทั้งหมดที่ถูกผูกไว้ในองค์ประกอบในกรณีนี้ในองค์ประกอบใด ๆid="elm"?

คำตอบ:


517

ใน jQuery รุ่นที่ทันสมัยคุณจะต้องใช้$._dataวิธีการเพื่อค้นหากิจกรรมใด ๆ ที่แนบโดย jQuery กับองค์ประกอบที่เป็นปัญหา หมายเหตุนี่เป็นวิธีการใช้งานภายในเท่านั้น:

// Bind up a couple of event handlers
$("#foo").on({
    click: function(){ alert("Hello") },
    mouseout: function(){ alert("World") }
});

// Lookup events for this particular Element
$._data( $("#foo")[0], "events" );

ผลลัพธ์จาก$._dataจะเป็นวัตถุที่มีทั้งเหตุการณ์ที่เราตั้งไว้ (ภาพด้านล่างด้วยmouseoutคุณสมบัติที่ขยาย):

คอนโซลเอาต์พุตสำหรับ $ ._

จากนั้นใน Chrome คุณสามารถคลิกขวาที่ฟังก์ชันตัวจัดการแล้วคลิก "ดูคำจำกัดความของฟังก์ชัน" เพื่อแสดงจุดที่ถูกต้องในรหัสของคุณ


59
ใช้งานได้กับองค์ประกอบที่เชื่อมต่อผ่านตัวช่วย jQuery เท่านั้น
Alex Ciminian

3
@jammypeach ฉันกำลังพยายามแก้ปัญหาของคุณ แต่ยังไม่ได้รับการส่งคืนสำหรับตัวเลือก ฉันใช้ $ ('# elem') ผูก ('คลิก', ฟังก์ชัน () {}); ถ้านั่นจะสร้างความแตกต่าง
มาร์คัส

6
@marcus ahhh, woops ฉันคิดถึงอะไรบางอย่างขอโทษ :)$._data(element[0], ‘events’);
totalNotLizards

16
วันนี้เราต้องใช้: $ ._ data ($ ('# foo') [0]) กิจกรรม
โดนัลด์เทย์เลอร์

5
$._data()ถูกใช้โดย JQuery ภายใน $.data()เป็นวิธีสาธารณะสำหรับผู้ใช้ และ$.data(element, 'events')ทำงานได้ดี
slideshowp2

73

กรณีทั่วไป:

  • ตี F12เพื่อเปิดเครื่องมือ Dev
  • คลิก Sourcesแท็บ
  • ทางด้านขวาเลื่อนลงไปที่ Event Listener Breakpointsและขยายต้นไม้
  • คลิกที่กิจกรรมที่คุณต้องการฟัง
  • โต้ตอบกับองค์ประกอบเป้าหมายหากพวกเขายิงคุณจะได้รับจุดพักในการดีบั๊ก

ในทำนองเดียวกันคุณสามารถ:

  • คลิกขวาที่องค์ประกอบเป้าหมาย -> เลือก "Inspect element "
  • เลื่อนลงทางด้านขวาของกรอบ dev ที่ด้านล่างคือ 'event listeners '
  • ขยายแผนผังเพื่อดูว่ามีเหตุการณ์ใดเชื่อมต่อกับองค์ประกอบ ไม่แน่ใจว่าสามารถใช้งานได้กับเหตุการณ์ที่จัดการผ่าน bubbling หรือไม่ (ฉันเดาไม่ได้)

3
ฉันยอมรับว่านี่เป็นวิธีการที่ต้องการและเป็นวิธีการแก้ปัญหาสากลเทียบกับการพึ่งพา jQuery ซึ่งอาจจะมีหรือไม่มีก็ได้
deadbabykitten

3
@dead umm ... คำถามนี้อ้างถึง jQuery และใช้ jQuery ในตัวอย่างไฟล์แนบ - คำตอบควรจะถูกต้องในบริบทของ jQuery (?)
Code Jockey

3
การเข้าใจคำตอบในบริบทอื่น ๆ ก็มีประโยชน์เช่นกัน เพียงเพราะมีคนถามคำถามที่เฉพาะเจาะจงไม่ได้หมายความว่าคำตอบที่ถูก จำกัด ที่พวกเขาจะได้รับนั้นเป็นคำตอบที่ดีที่สุด โดยเฉพาะอย่างยิ่งกับ jQuery ผู้คนมักจะพึ่งพามันเป็นไม้ค้ำ การเข้าใจสถาปัตยกรรมพื้นฐานเป็นสิ่งสำคัญ คำตอบนี้แสดงให้เห็นว่าไม่จำเป็นต้องมี jQuery คำถามและตัวอย่างคลุมเครือเกินกว่าที่จะรู้การใช้งานดังนั้นจึงเปิดให้มีการตีความสิ่งที่ถือได้ว่าเป็นคำตอบที่ถูกต้อง
deadbabykitten

12

ฉันกำลังเพิ่มสิ่งนี้ไว้สำหรับลูกหลาน มีวิธีที่ง่ายกว่าที่ไม่เกี่ยวข้องกับการเขียน JS มากขึ้น โดยใช้addon Firebug ที่น่าตื่นตาตื่นใจสำหรับ Firefox ,

  1. คลิกขวาที่องค์ประกอบแล้วเลือก 'ตรวจสอบองค์ประกอบด้วย Firebug'
  2. ในแผงด้านข้าง (แสดงในภาพหน้าจอ) ไปที่แท็บเหตุการณ์โดยใช้ลูกศรเล็ก ๆ
  3. แท็บเหตุการณ์แสดงเหตุการณ์และฟังก์ชั่นที่เกี่ยวข้องสำหรับแต่ละเหตุการณ์
  4. ข้อความถัดจากมันจะแสดงตำแหน่งของฟังก์ชั่น

ป้อนคำอธิบายรูปภาพที่นี่


1
นอกจากนี้ยังมีในเครื่องมือ dev ของ IE
devlin carnate

9

ตอนนี้คุณสามารถรับรายการผู้ฟังเหตุการณ์ที่ผูกไว้กับวัตถุโดยใช้ฟังก์ชัน javascript getEventListeners ()

ตัวอย่างเช่นพิมพ์สิ่งต่อไปนี้ในคอนโซลเครื่องมือ dev:

// Get all event listners bound to the document object
getEventListeners(document);

4
ฉันคิดว่านั่นไม่ใช่ฟังก์ชันเนทีฟและต้องการสคริปต์ / การพึ่งพาต่อไปนี้: github.com/colxi/getEventListenersสิ่งนี้ควรเพิ่มเข้าไปในคำตอบเนื่องจากมันทำให้เข้าใจผิด แต่ขอขอบคุณที่พาฉันไปที่ 'ปลั๊กอิน'; ดูดี. :)
Dennis98

6

ตรวจสอบ jQuery ปลั๊กอินปลั๊กอินควรปล่อยให้คุณทำเช่นนี้ผ่านปกติเครื่องมือ Chrome Dev มันไม่สมบูรณ์แบบ แต่ควรให้คุณเห็นตัวจัดการจริงที่ถูกผูกไว้กับองค์ประกอบ / เหตุการณ์และไม่ใช่แค่ตัวจัดการ jQuery ทั่วไป


3

แม้ว่านี่จะไม่เฉพาะเจาะจงกับตัวเลือก / วัตถุ jQuery ใน FireFox Quantum 58.x คุณสามารถค้นหาตัวจัดการเหตุการณ์บนองค์ประกอบโดยใช้เครื่องมือ Dev:

  1. คลิกขวาที่องค์ประกอบ
  2. ในเมนูบริบทคลิก 'ตรวจสอบองค์ประกอบ'
  3. หากมีไอคอน 'ev' ติดกับองค์ประกอบ (กล่องสีเหลือง) ให้คลิกที่ไอคอน 'ev'
  4. แสดงกิจกรรมทั้งหมดสำหรับองค์ประกอบนั้นและตัวจัดการเหตุการณ์

เครื่องมือ FF Quantum Dev


1
คำตอบที่ยอดเยี่ยมโดยเฉพาะภาพหน้าจอทำให้ง่ายขึ้นมาก ขอบคุณสำหรับความพยายาม!
bizi

2

ฉันใช้บางสิ่งเช่นนี้ถ้า ($ ._ data ($ ("a.wine-item-link") [0]). เหตุการณ์ == null) {... ทำบางสิ่งบางอย่าง, ผูกตัวจัดการเหตุการณ์ของพวกเขาอีกครั้ง} เพื่อตรวจสอบ ถ้าองค์ประกอบของฉันถูกผูกไว้กับเหตุการณ์ใด ๆ มันจะยังบอกว่าไม่ได้กำหนด (null) หากคุณไม่ได้แนบตัวจัดการเหตุการณ์ทั้งหมดของคุณจากองค์ประกอบนั้น นั่นคือเหตุผลที่ฉันประเมินสิ่งนี้ในการแสดงออกถ้า


2

โปรดทราบว่าเหตุการณ์อาจถูกแนบมากับเอกสารแทนที่จะเป็นองค์ประกอบที่เป็นปัญหา ในกรณีนั้นคุณจะต้องใช้:

$._data( $(document)[0], "events" );

และค้นหาเหตุการณ์ด้วยตัวเลือกที่ถูกต้อง:

ป้อนคำอธิบายรูปภาพที่นี่

จากนั้นดูที่ตัวจัดการ > [[FunctionLocation]]

ป้อนคำอธิบายรูปภาพที่นี่


0

เมื่อฉันส่งเคียวรี DOM ที่ซับซ้อนเล็กน้อยไปยังข้อมูล $ ._ ดังนี้: $._data($('#outerWrap .innerWrap ul li:last a'), 'events')มันจะไม่ได้กำหนดในคอนโซลของเบราว์เซอร์

ดังนั้นฉันต้องใช้ข้อมูล $ ._ บน div div: $._data($('#outerWrap')[0], 'events')เพื่อดูเหตุการณ์สำหรับแท็ก นี่คือ JSFiddle สำหรับสิ่งเดียวกัน: http://jsfiddle.net/giri_jeedigunta/MLcpT/4/


3
$('#outerWrap')เหตุผลของเรื่องนี้คือการที่คุณจะได้รับการมอบหมายจากเหตุการณ์ เหตุการณ์ต่าง ๆ นั้นถูกผูกไว้กับองค์ประกอบนั้นแทนที่จะยึดแต่ละตัว
Scottux
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.