Mai mult
Cum de a găsi ascultătorii eveniment pe un nod DOM atunci când depanare sau de cod JavaScript?
Am o pagină în cazul în care un eveniment ascultătorii sunt atașate la cutii de intrare și selectați cutii. Există o modalitate de a afla care ascultătorii eveniment sunt observarea unui anumit nod DOM și pentru ce eveniment?
Evenimentele sunt atașate folosind:
- Prototip's Eveniment.observa`;
- DOM's
addEventListener
; - Ca element atribut element.onclick`.
799
18
Dacă aveți nevoie doar pentru a inspecta ce's-a întâmplat pe o pagina, s-ar putea încerca Eveniment Vizual bookmarklet.
Update: Eveniment Vizual 2 disponibil;
Aceasta depinde de modul în care evenimentele sunt atașate. Pentru exemplificare presupunem că avem următoarele click handler:
Am're de gând să-l atașați la elementul nostru folosind diferite metode, unele care să permită inspecția și unele care nu't.
Metoda a) single event handler
Metoda B) mai multe stivuitoare eveniment
Metoda C): jQuery
// inspecta var clickEvents = $(element).date de("evenimente").faceți clic; jQuery.fiecare(clickEvents, functia(cheie, valoare) { alert(valoare) // alerte "function() { alert('clic!') }" })
// inspecta var clickEvents = $(element).date de("evenimente").faceți clic; jQuery.fiecare(clickEvents, functia(cheie, handlerObj) { alert(handlerObj.handler) // alerte "function() { alert('clic!') }" // de asemenea, disponibile: handlerObj.tip, handlerObj.nume })
(a se Vedea
jQuery.fn.date
șijQuery.date
)Metoda D): Prototip (murdar)
// inspecta Eveniment.observatori.fiecare(function(item) { dacă(obiect[0] == element) { alert(articol2) // alerte "function() { alert('clic!') }" } })
// inspecta. "_eventId" pentru < 1.6.0.3 în timp ce // "_prototypeEventID" a fost introdus în 1.6.0.3 var clickEvents = Eveniment.cache[element._eventId || (element._prototypeEventID|| [])[0]].faceți clic; clickEvents.fiecare(function(wrapper){ alert(wrapper.handler) // alerte "function() { alert('clic!') }" })
// inspecta var clickEvents = element.getStorage().ia('prototype_event_registry').ia('faceți clic pe'); clickEvents.fiecare(function(wrapper){ alert(wrapper.handler) // alerte "function() { alert('clic!') }" })
Chrome, Firefox, Vivaldi și Safari sprijin `getEventListeners(domElement) în Instrumente de dezvoltare consola.
Pentru majoritatea scopuri de depanare, acest lucru ar putea fi folosit.
Mai jos este o referință foarte bună să-l folosească: https://developers.google.com/web/tools/chrome-devtools/console/utilities#geteventlisteners
WebKit Inspector în Chrome sau Safari browsere acum face acest lucru. Se va afișa ascultătorii eveniment pentru un element DOM atunci când selectați-l în Elemente de panou.
Este posibil pentru a lista toate ascultătorii eveniment în JavaScript: It's nu-i greu; trebuie doar să hack "prototip" 's metoda de elemente HTML (înainte adăugarea de ascultători).
Acum, fiecare element de ancorare ("a") va avea un `lastListenerInfo de proprietate care conține toate ascultătorii săi. Și este chiar și lucrează pentru a scoate ascultătorii cu funcții anonime.
Utilizarea getEventListeners în Google Chrome:
(Rescrierea răspunsul din această întrebare, deoarece's relevante aici.)
Atunci când depanare, dacă doriți doar pentru a vedea evenimente, am recomandăm să fie...
Dacă doriți să utilizați evenimente în codul dvs., și sunteți folosind jQuery înainte de versiunea 1.8, puteți folosi:
pentru a obține evenimente. Începând cu versiunea 1.8, folosind .date de("evenimente") este întrerupt (a se vedea acest bug bilet). Puteți folosi:
Un alt exemplu: Scrie toate evenimente click pe un anumit link-ul de la consola:
(a se vedea http://jsfiddle.net/HmsQC/ pentru un exemplu de lucru)
Din păcate, utilizarea $._data acest lucru nu este recomandat cu excepția pentru depanare, deoarece acesta este un intern jQuery structura, și-ar putea schimba în viitor versiuni. Din păcate nu cunosc nici un alt mijloc ușor de a accesa evenimente.
1:
Prototip.observa
folosește un Element.addEventListener (a se vedea codul sursă)2: puteți suprascrie
Element.addEventListener
să-și amintească adăugat ascultători (la îndemână proprietateaEventListenerList
a fost scos din DOM3 spec propunere). Rula acest cod înainte de orice eveniment este atașat:Citiți toate evenimentele de:
Și don't uita pentru a trece peste
Element.removeEventListener
pentru a elimina eveniment de personalizatElement.eventListenerList
.3: `Element.onclick proprietatea are nevoie de îngrijire specială aici:
4: don't uita Element.onclick conținutul atribut: acestea sunt două lucruri diferite:
Deci, ai nevoie să-l ocupe, de asemenea:
La Eveniment Vizual bookmarklet (menționat în cel mai popular răspuns) doar fură bibliotecă personalizat handler cache:
Element imperative poate fi pusă la îndoială (de exemplu, pentru că există unele DOM caracteristici specifice, cum ar fi live colecții, care nu pot fi codificate în JS), dar oferă eventListenerList suport nativ și funcționează în Chrome, Firefox și Opera (nu't de muncă în IE7).
Ai putea folie nativ DOM metode pentru gestionarea eveniment ascultătorilor de a pune acest lucru în partea de sus a
<head>
:H/T @les2
Firefox developer tools acum face acest lucru. Evenimentele sunt afișate făcând clic pe "ev" buton de pe partea dreaptă a fiecărui element's de afișare, inclusiv jQuery și DOM evenimente.
Dacă aveți Firebug, puteți folosi consola.dir(obiect sau matrice)` pentru a imprima un copac frumos in consola jurnal de orice JavaScript scalar, matrice, sau un obiect.
Încercați:
sau
Complet de lucru de soluție bazată pe [răspunde de Jan Turon][1] - se comportă ca
getEventListeners()
din consola:(Există un mic bug cu duplicate. Nu't pauză de mult, oricum.)
Opera 12 (nu cele mai recente Chrome Webkit motorul de baza) Libelula a avut acest lucru pentru un timp și este evident afișate în structura DOM. În opinia mea, este un superior debugger și este singurul motiv pentru care rămase de ce eu încă mai folosesc Opera 12 versiunea de bază (nu există nici v13, v14 și versiunea v15 bazate pe Webkit nu are Libelula încă)
Recent am fost de lucru cu evenimente și a vrut pentru a putea vizualiza și/sau de a controla toate evenimentele într-o pagină. M-am uitat la soluțiile posibile, am'am decis să merg pe drumul meu și de a crea un sistem personalizat pentru a monitoriza evenimente. Deci, am făcut trei lucruri.
În primul rând, am nevoie de un container pentru toate ascultătorii eveniment în pagina: care's'EventListeners
obiect. Ea are trei metode utile:
add(),
remove ()", și " get()`.Apoi, am creat un EventListener
obiect să dețină informațiile necesare pentru eveniment, și anume: "țintă", "tip",
callback,
opțiuni,
useCapture,
wantsUntrusted, și a adăugat o metodă
remove()` pentru a elimina ascultător.În cele din urmă, mi-am prelungit nativ
addEventListener () " și "removeEventListener()
metode pentru a le face de lucru cu obiectele I'am creat (EventListener" și " EventListeners
).Utilizare:
addEventListener () creează un EventListener
obiect, adaugă-l laEventListeners
și returneazăEventListener
obiect, astfel încât acesta poate fi eliminat mai târziu.EventListeners.obține()
poate fi folosit pentru a vizualiza ascultători, în pagina. Se acceptă un EventTarget` sau un șir de caractere (tipul de eveniment).Demo
Las's spunem că vreau să știu fiecare ascultător eveniment in aceasta pagina curentă. Putem face asta (presupunand ca're folosind un script manager de extensie, Tampermonkey în acest caz). Următorul script face acest lucru:
Și când vom lista toate ascultătorii, se spune că există 299 ascultătorii eveniment. Acolo "pare" să fie niște duplicate, dar eu nu't știu dacă au're într-adevăr duplicate. Nu orice tip de eveniment este duplicat, deci toate acele "duplicate" ar putea fi un individ ascultător.
Cod pot fi găsite la repository. am n't doriți să-l posta aici, deoarece's destul de lung.
Actualizare: Acest lucru nu't părea pentru a lucra cu jQuery. Când voi examina EventListener, văd că callback este
Cred că aceasta aparține jQuery, și nu este efectivă de apel invers. jQuery magazine real de apel invers din lista de proprietăți a EventTarget:
Pentru a elimina un ascultător eveniment, real callback trebuie să fi trecut la `removeEventListener () metodă. Deci, în scopul de a face acest lucru cu jQuery, este nevoie de modificări ulterioare. S-ar putea stabili că în viitor.
Prototip 1.7.1 mod
Încerc să fac asta în jQuery 2.1, și cu "
$().faceți clic pe() -> $(element).date de("evenimente").faceți clic;
" metodă nu't de lucru.Mi-am dat seama că numai $._data() functioneaza in cazul meu :
Există frumos jQuery Evenimente extensie :
schimbarea acestor funcții va permite să vă conectați ascultătorii adăugat:
citește restul ascultătorilor cu