Comment puis-je vérifier si un JavaScript Eventhandler a été défini?

J'ai une fonction JavaScript qui définit l'événement "onclick" de certains noeuds HTML, même si ce "onclick" a été défini précédemment.

Comment puis-je vérifier si cet événement a déjà été configuré, donc je peux étendre ma fonction pour définir l'événement uniquement sur les nœuds HTML où il n'a pas déjà été défini?

Vérifiez, comme ceci:

if(typeof someNode.onclick == "function") { // someNode has an event handler already set for the onclick event... } 

Soit dit en passant, si vous utilisez une bibliothèque, vous devriez le dire – si vous êtes, il pourrait être plus facile / plus propre et différerait en fonction de la bibliothèque que vous utilisez …

Il devrait être possible de détecter les gestionnaires d'événements en utilisant <element>.addEventListener() en interceptant les appels à la fonction:

 var myListOfAddedEvents = []; var realAddEventListener = HTMLElement.prototype.addEventListener; HTMLElement.prototype.addEventListener = function(evtType,fn,cap) { myListOfAddedEvents.push( {on: this, type: evtType, handler: fn, capture: cap} ); return realAddEventListener.apply(this, arguments); }; 

Remarque: C'est un code non testé et peut-être besoin d'un peu de travail. J'espère que cette même fonction sera utilisée par tous les types d'éléments, mais je pourrais me tromper. De plus, cela ne fonctionnera que si vous pouvez exécuter ce bit de code avant de commencer à ajouter des événements. Une copie pour attachEvent pourrait être construite de manière similaire.

 <input type="button" id="foo" name="foo" value="bar" /> <script type="text/javascript"> alert(document.getElementById('foo').onclick); //undefined </script> 

Donc, ce que vous voulez faire, c'est quelque chose comme ça:

 <script type="text/javascript"> if (undefined == document.getElementById('foo').onclick) { // Add event handler } </script> 

Une autre alternative, ajoutant classe à élément

 if(!elem.class.match('hasEvent')) { elem.addEventListener(event, function(){}); elem.className = elem.className + ' hasEvent'; }