2016-04-03 13 views
1

I der nativen DOM bin mit addEventListener Ereignis wie folgt:addEventListener Befestigung nicht an der richtigen Umfang

const domElement = document.getElementById('ember464'); 
domElement.addEventListener('click', dosomething); 
this._listeners.push({target: domElement, type: 'click', callback: dosomething}); 

dies das Ereignis registriert und speichert sie in einem Array _listeners so kann es später gereinigt werden. Die gute Nachricht ist, dass dieses Ereignis an das DOM-Ereignis angehängt wird, obwohl das Ziel eindeutig auf die einzelne Schaltfläche beschränkt ist. Der Handler scheint zu zünden, wenn ein Klick erkannt wird irgendwo auf dem Dokument!

Mache ich etwas falsch?

p.s. hier ist der Browser-Inspektor Blick auf die _listener Array ... Beachten Sie, dass die Hervorhebung der "Ziel" zeigt tatsächlich nur auf die Schaltfläche, die ich versuche zu targetieren. AKA, das Ziel ist der DOM-Knoten und nicht der Selektor, der zum Identifizieren des Knotens verwendet wird.

image


Ich habe jetzt im Debugger auf dem angestrebten DOM-Element sah, und ich sehe die folgenden:

enter image description here


Für alle, die mutig genug, hier ist ein Arbeitsdemonstration des Codes. Die zweite Schaltfläche wird durch den „Klick“ ausgelöstes Ereignis ist das Thema dieser Ausgabe:

https://ui-animate.firebaseapp.com/

Der vollständige Quellcode ist hier: link

+3

Ihr Code sieht OK aus und ich habe es getestet (Chrome) und funktioniert wie es sollte. Gehen Sie zu den Debugger-Tools, überprüfen Sie das ember464-Element, wählen Sie "Event Listeners" und aktivieren Sie das Ankreuzfeld für Ancestors, und sehen Sie, ob es Ihnen hilft. –

+0

@SideriteZackwehdex danke für den Vorschlag; Ich habe einen Screenshot des Ereignis-Listeners hinzugefügt, den ich angehängt habe, und er wird auf der Fenster-Ebene hinzugefügt, obwohl ich zu 99% sicher bin, dass ich den richtigen Bereich dafür erfasst habe. :( – ken

Antwort

1

Ok, das Problem war, in einem ein bisschen Code, den ich in der Frage nicht dargestellt hatte. Moderner Browser unterstützt alle die DOM-Methode addEventListener aber um älteren Browser zu unterstützen, die nur attachEvent haben hatte ich die folgende Abstraktion hinzugefügt:

registerListener(target, type, callback) { 
    const addListener = target.addEventListener || target.attachEvent; 
    const eventName = target.addEventListener ? type : 'on' + type; 

    addListener(eventName, callback); 
}, 

Das Problem dabei ist, dass der „this“ Kontext, in dem Ruf verloren. Also habe ich stattdessen folgendes geändert:

registerListener(target, type, callback) { 
    const listenerFunction = target.addEventListener ? 'addEventListener' : 'attachEvent'; 
    const eventName = target.addEventListener ? type : 'on' + type; 

    target[listenerFunction](eventName, callback); 
}, 
+1

Sie hätten addListener.apply (target, [eventName, callback] verwenden können.) Ich wollte vorschlagen, dass die ui-animate-Funktion ein domElement verwendet, das funktioniert, aber dasjenige, das eigentlich die Quelle des Ereignisses ist ist nicht angegeben und vielleicht lag es daran, dass der Shake ui-animate außerhalb des Buttons und im Fenster definiert wurde. Froh, dass du ihn gelöst hast. –

Verwandte Themen