Hier ist mein Problem: Ist es irgendwie möglich, die Existenz eines dynamisch angehängten Ereignis-Listeners zu überprüfen? Oder wie kann ich den Status der Eigenschaft "onclick" (?) In DOM überprüfen? Ich habe wie Stack Overflow im Internet nach einer Lösung gesucht, aber kein Glück. Hier ist mein HTML:
<a id="link1" onclick="linkclick(event)"> link 1 </a>
<a id="link2"> link 2 </a> <!-- without inline onclick handler -->
Dann hänge ich in Javascript dynamisch erstellten Ereignis-Listener an den 2. Link an:
document.getElementById('link2').addEventListener('click', linkclick, false);
Der Code läuft gut, aber alle meine Versuche, diesen angehängten Listener zu erkennen, schlagen fehl:
// test for #link2 - dynamically created eventlistener
alert(elem.onclick); // null
alert(elem.hasAttribute('onclick')); // false
alert(elem.click); // function click(){[native code]} // btw, what's this?
jsFiddle ist da . Wenn Sie auf "Add onclick for 2" und dann auf "[link 2]" klicken, wird das Ereignis gut ausgelöst, aber der "Test link 2" meldet immer false. Kann jemand helfen?
Antworten:
Es gibt keine Möglichkeit zu überprüfen, ob dynamisch angehängte Ereignis-Listener vorhanden sind oder nicht.
Sie können nur sehen, ob ein Ereignis-Listener angehängt ist, indem Sie Ereignis-Listener wie folgt anhängen:
Sie können dann testen, ob ein Ereignis-Listener angehängt wurde,
onclick
indem Sie zurückkehren!!elem.onclick
(oder etwas Ähnliches).quelle
Ich habe so etwas gemacht:
Erstellen eines speziellen Attributs für ein Element, wenn der Listener angehängt ist, und Überprüfen, ob es vorhanden ist.
quelle
Ich würde einen Booleschen Wert außerhalb Ihrer Funktion erstellen, der als FALSE beginnt und beim Anhängen des Ereignisses auf TRUE gesetzt wird. Dies würde als eine Art Flagge für Sie dienen, bevor Sie das Ereignis erneut anhängen. Hier ist ein Beispiel für die Idee.
quelle
tl; dr : Nein, Sie können dies nicht auf nativ unterstützte Weise tun.
Die einzige Möglichkeit, dies zu erreichen, besteht darin, ein benutzerdefiniertes Speicherobjekt zu erstellen, in dem Sie die hinzugefügten Listener aufzeichnen. Etwas in der folgenden Richtung:
Schritt 1: Zunächst benötigen Sie eine Funktion, die das Speicherobjekt durchlaufen und den Datensatz eines Elements mit dem angegebenen Element (oder false) zurückgeben kann.
Schritt 2: Dann benötigen Sie eine Funktion, die einen Ereignis-Listener hinzufügen, aber auch den Listener in das Speicherobjekt einfügen kann.
Schritt 3: In Bezug auf die tatsächliche Anforderung Ihrer Frage benötigen Sie die folgende Funktion, um zu überprüfen, ob einem Element ein Ereignis-Listener für ein bestimmtes Ereignis hinzugefügt wurde.
Schritt 4: Schließlich benötigen Sie eine Funktion, mit der Sie einen Listener aus dem Speicherobjekt löschen können.
Snippet:
Code-Snippet anzeigen
Obwohl mehr als fünf Jahre vergangen sind, seit das OP die Frage gestellt hat, glaube ich, dass Menschen, die in Zukunft darauf stoßen, von dieser Antwort profitieren werden. Sie können also gerne Vorschläge oder Verbesserungen dazu machen. 😊
quelle
Mögliches Duplikat: Überprüfen Sie, ob auf einem Element ein Ereignis-Listener vorhanden ist. Keine jQuery finden Sie meine Antwort.
Grundsätzlich ist hier der Trick für Chromium (Chrome) Browser:
quelle
Sie können jederzeit manuell überprüfen, ob Ihr EventListener vorhanden ist, indem Sie beispielsweise den Chrome-Inspektor verwenden. Auf der Registerkarte "Element" befindet sich die traditionelle Unterregisterkarte "Stile" und in der Nähe eine weitere: "Ereignis-Listener". Dadurch erhalten Sie eine Liste aller EventListener mit ihren verknüpften Elementen.
quelle
Es scheint seltsam, dass diese Methode nicht existiert. Ist es Zeit, es endlich hinzuzufügen?
Wenn Sie wollten, könnten Sie so etwas wie das Folgende:
quelle
Hier ist ein Skript, mit dem ich überprüft habe, ob ein dynamisch angehängter Ereignis-Listener vorhanden ist. Ich habe jQuery verwendet, um einen Ereignishandler an ein Element anzuhängen und dann dieses Ereignis auszulösen (in diesem Fall das Ereignis 'click'). Auf diese Weise kann ich Ereigniseigenschaften abrufen und erfassen, die nur vorhanden sind, wenn der Ereignishandler angehängt ist.
quelle
Es scheint keine browserübergreifende Funktion zu geben, die nach Ereignissen sucht, die unter einem bestimmten Element registriert sind.
Es ist jedoch möglich, die Rückruffunktionen für Elemente in einigen Browsern mithilfe ihrer Entwicklungstools anzuzeigen. Dies kann hilfreich sein, wenn Sie versuchen, die Funktionsweise einer Webseite zu bestimmen oder Code zu debuggen.
Feuerfuchs
Zeigen Sie zunächst das Element auf der Registerkarte Inspektor in den Entwicklertools an. Das kann gemacht werden:
Wenn Ereignisse für das Element registriert wurden, wird neben dem Element eine Schaltfläche mit dem Wort Ereignis angezeigt. Wenn Sie darauf klicken, werden die Ereignisse angezeigt, die für das Element registriert wurden. Durch Klicken auf den Pfeil neben einem Ereignis können Sie die Rückruffunktion für dieses Ereignis anzeigen.
Chrom
Zeigen Sie zunächst das Element auf der Registerkarte Elemente in den Entwicklertools an. Das kann gemacht werden:
In der Nähe des Abschnitts des Fensters, in dem der Baum mit den Webseitenelementen angezeigt wird, sollte sich ein weiterer Abschnitt mit einer Registerkarte mit dem Titel "Ereignis-Listener" befinden. Wählen Sie diese Option aus, um Ereignisse anzuzeigen, die für das Element registriert wurden. Um den Code für ein bestimmtes Ereignis anzuzeigen, klicken Sie auf den Link rechts davon.
In Chrome können Ereignisse für ein Element auch mit der Funktion getEventListeners gefunden werden. Basierend auf meinen Tests listet die Funktion getEventListeners jedoch keine Ereignisse auf, wenn mehrere Elemente an sie übergeben werden. Wenn Sie alle Elemente auf der Seite mit Listenern suchen und die Rückruffunktionen für diese Listener anzeigen möchten, können Sie dazu den folgenden Code in der Konsole verwenden:
Bitte bearbeiten Sie diese Antwort, wenn Sie wissen, wie Sie dies in den angegebenen Browsern oder in anderen Browsern tun können.
quelle
Ich habe das gerade herausgefunden, indem ich versucht habe zu sehen, ob meine Veranstaltung beigefügt ist ...
wenn Sie tun :
es wird "null" zurückgeben
aber wenn Sie dies tun:
dann ist es "WAHR"
Wenn Sie also "addEventListener" zum Hinzufügen von Ereignishandlern verwenden, können Sie nur über "hasOwnProperty" darauf zugreifen. Ich wünschte, ich wüsste warum oder wie, aber leider habe ich nach Recherchen keine Erklärung gefunden.
quelle
onclick
ist getrennt von.addEventListener
- es beeinflusst ein Attribut, während.addEventListener
dies nicht der Fall istWenn ich es gut verstehe, können Sie nur überprüfen, ob ein Listener überprüft wurde, nicht jedoch, welcher Listener speziell der Moderator ist.
Ein Ad-hoc-Code würde also die Lücke füllen, um Ihren Codierungsfluss zu handhaben. Eine praktische Methode wäre das Erstellen einer
state
using-Variablen. Fügen Sie beispielsweise den Checker eines Listeners wie folgt hinzu:Wenn Sie dann einen Listener einstellen, ändern Sie einfach den Wert:
Anschließend können Sie im Rückruf Ihres eventListener bestimmte Funktionen zuweisen und auf dieselbe Weise den Zugriff auf Funktionen abhängig von einem bestimmten Status als Variable verteilen, z. B.:
quelle
Entfernen Sie einfach das Ereignis, bevor Sie es hinzufügen:
quelle
Ich habe gerade ein Skript geschrieben, mit dem Sie dies erreichen können. Es gibt Ihnen zwei globale Funktionen:
hasEvent(Node elm, String event)
undgetEvents(Node elm)
die Sie nutzen können. Beachten Sie, dass dieEventTarget
Prototypmethode geändertadd/RemoveEventListener
wird und nicht für Ereignisse funktioniert, die über HTML-Markup oder Javascript-Syntax von hinzugefügt wurdenelm.on_event = ...
Mehr Infos bei GitHub
Live-Demo
Skript:
quelle
Theoretisch können Sie addEventListener und removeEventListener huckepack nehmen, um dem 'this'-Objekt ein Flag zum Entfernen hinzuzufügen. Hässlich und ich habe nicht getestet ...
quelle