Je dois déboguer une application Web qui utilise jQuery pour effectuer des manipulations assez complexes et désordonnées DOM . À un moment donné, certains événements liés à des éléments particuliers ne sont pas déclenchés et cessent tout simplement de fonctionner.
Si j'avais la possibilité de modifier le code source de l'application, j'exploiterais et ajouterais un tas d'instructions Firebugconsole.log()
et de commentaires/décommenter du code pour tenter de cerner le problème. Mais supposons que je ne puisse pas éditer le code de l’application et que j’ai besoin de travailler entièrement dans Firefox avec Firebug ou des outils similaires.
Firebug est très efficace pour me permettre de naviguer et de manipuler le DOM. Jusqu'à présent, cependant, je n'ai pas été capable de comprendre comment faire du débogage d'événement avec Firebug. Plus précisément, je souhaite simplement voir une liste de gestionnaires d’événements liés à un élément particulier à un moment donné (en utilisant les points d’arrêt Firebug JavaScript pour suivre les modifications). Mais soit Firebug n’a pas la capacité de voir les événements liés, soit je suis trop bête pour le trouver. :-)
Des recommandations ou des idées? Idéalement, j'aimerais simplement voir et éditer des événements liés à des éléments, de la même manière que je peux éditer le DOM aujourd'hui.
Voir Comment trouver des écouteurs d'événement sur un nœud DOM .
En un mot, en supposant qu’à un moment donné un gestionnaire d’événements soit attaché à votre élément (par exemple): $('#foo').click(function() { console.log('clicked!') });
Vous l'inspectez comme ça:
jQuery 1.3.x
_var clickEvents = $('#foo').data("events").click;
jQuery.each(clickEvents, function(key, value) {
console.log(value) // prints "function() { console.log('clicked!') }"
})
_
jQuery 1.4.x
_var clickEvents = $('#foo').data("events").click;
jQuery.each(clickEvents, function(key, handlerObj) {
console.log(handlerObj.handler) // prints "function() { console.log('clicked!') }"
})
_
Voir jQuery.fn.data
(où jQuery stocke votre gestionnaire en interne).
jQuery 1.8.x
_var clickEvents = $._data($('#foo')[0], "events").click;
jQuery.each(clickEvents, function(key, handlerObj) {
console.log(handlerObj.handler) // prints "function() { console.log('clicked!') }"
})
_
Il existe un joli bookmarklet appelé Visual Event qui peut vous montrer tous les événements attachés à un élément. Il est doté de couleurs surlignées pour différents types d’événements (souris, clavier, etc.). Lorsque vous les survolez, le corps du gestionnaire d'événements, son mode de rattachement, ainsi que le numéro de fichier/ligne (sur WebKit et Opera) sont affichés. Vous pouvez également déclencher l'événement manuellement.
Il ne peut pas trouver tous les événements car il n'existe aucun moyen standard de rechercher les gestionnaires d'événements associés à un élément, mais cela fonctionne avec les bibliothèques populaires telles que jQuery, Prototype, MooTools, YUI, etc.
L'extension Eventbug a été publiée hier, voir: http://www.softwareishard.com/blog/firebug/eventbug-alpha-released/
Vous pouvez utiliser FireQuery . Il montre tous les événements attachés aux éléments DOM dans l'onglet HTML de Firebug. Il montre également toutes les données attachées aux éléments via $.data
.
Voici un plugin qui peut lister tous les gestionnaires d’événements pour un élément/événement donné:
$.fn.listHandlers = function(events, outputFunction) {
return this.each(function(i){
var elem = this,
dEvents = $(this).data('events');
if (!dEvents) {return;}
$.each(dEvents, function(name, handler){
if((new RegExp('^(' + (events === '*' ? '.+' : events.replace(',','|').replace(/^on/i,'')) + ')$' ,'i')).test(name)) {
$.each(handler, function(i,handler){
outputFunction(elem, '\n' + i + ': [' + name + '] : ' + handler );
});
}
});
});
};
Utilisez-le comme ceci:
// List all onclick handlers of all anchor elements:
$('a').listHandlers('onclick', console.info);
// List all handlers for all events of all elements:
$('*').listHandlers('*', console.info);
// Write a custom output function:
$('#whatever').listHandlers('click',function(element,data){
$('body').prepend('<br />' + element.nodeName + ': <br /><pre>' + data + '<\/pre>');
});
Src: (mon blog) -> http://james.padolsey.com/javascript/debug-jquery-events-with-listhandlers/
La console de développement WebKit (disponible dans Chrome, Safari, etc.) vous permet d'afficher les événements attachés aux éléments.
Utilisez $._data(htmlElement, "events")
dans jquery 1.7+;
ex:
$._data(document, "events")
ou $._data($('.class_name').get(0), "events")
Comme un collègue l’a suggéré, console.log> alert:
var clickEvents = $('#foo').data("events").click;
jQuery.each(clickEvents, function(key, value) {
console.log(value);
})
jQuery stocke les événements dans les éléments suivants:
$("a#somefoo").data("events")
Faire une console.log($("a#somefoo").data("events"))
devrait lister les événements attachés à cet élément.
Utilisation de DevTools dans le dernier Chrome (v29) Ces deux conseils sont très utiles pour le débogage d'événements:
Liste des événements jQuery du dernier élément DOM sélectionné
$ ._ data ( $ , "événements") // en supposant que jQuery 1.7+
Utilisation de la commande monitorEvents ()
J'ai aussi trouvé débogueur jQuery dans le magasin chrome. Vous pouvez cliquer sur un objet dom qui affichera tous les événements qui lui sont liés ainsi que la fonction de rappel. Je déboguais une application où les événements n'étaient pas supprimés correctement et cela m'aidait à la localiser en quelques minutes. Évidemment, ceci est pour chrome bien que, pas firefox.
On dirait que l'équipage FireBug travaille sur une extension EventBug. Cela ajoutera un autre panneau à FireBug - Events.
"Le panneau des événements répertorie tous les gestionnaires d’événements de la page, groupés par type d’événement. Pour chaque type d’événement, ouvrez-le pour afficher les éléments auxquels les écouteurs sont liés et un résumé de la source de la fonction." EventBug Rising
Bien qu'ils ne puissent pas dire pour le moment quand il sera publié.
Icône ev
à côté d'éléments
Dans le panneau de l'inspecteur des outils de développement de Firefox, tous les événements liés à un élément sont répertoriés.
Sélectionnez d'abord un élément avec Ctrl + Shift + C, par exemple. Flèche upvote de Stack Overflow.
Cliquez sur l'icône ev
à droite de l'élément pour ouvrir une boîte de dialogue:
Cliquez sur le symbole de signe de pause ||
de l'événement que vous souhaitez, ce qui ouvre le débogueur sur la ligne du gestionnaire.
Vous pouvez maintenant placer un point d'arrêt comme d'habitude dans le débogueur, en cliquant sur la marge de gauche de la ligne.
Ceci est mentionné à: https://developer.mozilla.org/en-US/docs/Tools/Page_Inspector/How_to/Examine_event_listeners
Malheureusement, je ne pouvais pas trouver un moyen pour que cela fonctionne bien avec prettyfication, il semble juste que s'ouvre à la ligne minifiée: Comment embellir Javascript et CSS dans Firefox/Firebug?
Testé sur Firefox 42.
Selon ce fil , Firebug n’a aucun moyen de voir quels événements sont attachés aux auditeurs sur un élément DOM.
Il semble que le mieux que vous puissiez faire est soit ce que suggère tj111, soit vous pouvez cliquer avec le bouton droit de la souris sur l'élément dans la visionneuse HTML, puis cliquer sur "Journaliser les événements" afin de voir quels événements sont déclenchés pour un élément DOM particulier. Je suppose qu'on pourrait le faire pour voir quels événements pourraient déclencher des fonctions particulières.
Avec la version 2.0, Firebug a introduit un Événements panneau , qui répertorie tous les événements de l'élément sélectionné dans le HTML panneau .
Il peut également afficher les écouteurs d’événements encapsulés dans les liaisons d’événements jQuery au cas où l’option Afficher les écouteurs encapsulés est cochée et accessible via le panneau Événements du panneau. menu .
Avec ce panneau, le workflow pour déboguer un gestionnaire d’événements est le suivant:
=> L'exécution du script s'arrête à la première ligne de la fonction de gestionnaire d'événements et vous pouvez la déboguer par étape.
Firebug 2 intègre maintenant le débogage/inspection des événements DOM.