Nur Frage: Gibt es eine Möglichkeit, alle Ereignisse eines Objekts, z. B. eines Div, vollständig zu entfernen?
EDIT: Ich füge pro div.addEventListener('click',eventReturner(),false);
Ereignis hinzu.
function eventReturner() {
return function() {
dosomething();
};
}
EDIT2: Ich habe einen Weg gefunden, der funktioniert, aber für meinen Fall nicht verwendet werden kann:
var returnedFunction;
function addit() {
var div = document.getElementById('div');
returnedFunction = eventReturner();
div.addEventListener('click',returnedFunction,false); //You HAVE to take here a var and not the direct call to eventReturner(), because the function address must be the same, and it would change, if the function was called again.
}
function removeit() {
var div = document.getElementById('div');
div.removeEventListener('click',returnedFunction,false);
}
javascript
events
dom
Florian Müller
quelle
quelle
div.onclick=null
. Natürlich sollten SieaddEventListener
in diesem Fall nicht ganz verwenden, da dadurch ein separater Listener hinzugefügt wird, der sich von dem in unterscheidetonclick
.Antworten:
Ich bin nicht sicher, was Sie mit Entfernen aller Ereignisse meinen . Alle Handler für einen bestimmten Ereignistyp oder alle Ereignishandler für einen bestimmten Typ entfernen?
Entfernen Sie alle Ereignishandler
Wenn Sie alle Ereignishandler (eines beliebigen Typs) entfernen möchten, können Sie das Element klonen und durch seinen Klon ersetzen:
Hinweis: Dadurch werden Attribute und untergeordnete Elemente beibehalten, Änderungen an den DOM-Eigenschaften werden jedoch nicht beibehalten.
Entfernen Sie "anonyme" Ereignishandler eines bestimmten Typs
Die andere Möglichkeit ist die Verwendung,
removeEventListener()
aber ich denke, Sie haben dies bereits versucht und es hat nicht funktioniert. Hier ist der Haken :Sie übergeben im Wesentlichen eine anonyme Funktion an
addEventListener
as,eventReturner
um eine Funktion zurückzugeben.Sie haben zwei Möglichkeiten, dies zu lösen:
Verwenden Sie keine Funktion, die eine Funktion zurückgibt. Verwenden Sie die Funktion direkt:
Erstellen Sie einen Wrapper
addEventListener
, in dem ein Verweis auf die zurückgegebene Funktion gespeichert wird, und erstellen Sie eine seltsameremoveAllEvents
Funktion:Und dann könnten Sie es verwenden mit:
DEMO
Hinweis: Wenn Ihr Code längere Zeit ausgeführt wird und Sie viele Elemente erstellen und entfernen, müssen Sie sicherstellen, dass die darin enthaltenen Elemente entfernt werden,
_eventHandlers
wenn Sie sie zerstören.quelle
element.parentNode
dies null sein kann. Sollte wahrscheinlich einen if-Check um diesen Code oben setzen.Dadurch werden alle Listener von untergeordneten Elementen entfernt, bei großen Seiten ist dies jedoch langsam. Brutal einfach zu schreiben.
quelle
document.querySelector('body').outerHTML = document.querySelector('body').outerHTML
arbeitete für mich.document.querySelector('body').outerHTML
du kannst einfach tippendocument.body.outerHTML
Verwenden Sie die eigene Funktion des Ereignis-Listeners
remove()
. Beispielsweise:quelle
getEventListeners
nur in den WebKit-Entwicklungstools und in FireBug verfügbar ist. Nicht etwas, das Sie einfach in Ihrem Code aufrufen können.getEventListeners()
. Beispiel:getEventListeners(document)
odergetEventListeners(document.querySelector('.someclass'))
getEventListeners(document).click.forEach((e)=>{e.remove()})
erzeugt diesen Fehler:VM214:1 Uncaught TypeError: e.remove is not a function
Wie corwin.amber sagt, gibt es Unterschiede zwischen Webkit und anderen.
In Chrome:
Damit erhalten Sie ein Objekt mit allen vorhandenen Ereignis-Listenern:
Von hier aus können Sie den Listener erreichen, den Sie entfernen möchten:
Also alle Event-Listener:
In Firefox
Ist ein bisschen anders, weil es einen Listener-Wrapper verwendet, der keine Entfernungsfunktion enthält. Sie müssen den Listener erhalten, den Sie entfernen möchten:
Alle Event-Listener:
Ich bin über diesen Beitrag gestolpert und habe versucht, den lästigen Kopierschutz einer Nachrichten-Website zu deaktivieren.
Genießen!
quelle
getEventListeners
das nicht definiert ist?Um die Antworten zu vervollständigen, finden Sie hier Beispiele aus der Praxis zum Entfernen von Ereignissen, wenn Sie Websites besuchen und keine Kontrolle über den generierten HTML- und JavaScript-Code haben.
Einige nervige Websites verhindern, dass Sie Benutzernamen in Anmeldeformulare kopieren und einfügen können. Dies kann leicht umgangen werden, wenn das
onpaste
Ereignis mit demonpaste="return false"
HTML-Attribut hinzugefügt wird. In diesem Fall müssen wir nur mit der rechten Maustaste auf das Eingabefeld klicken, in einem Browser wie Firefox "Element überprüfen" auswählen und das HTML-Attribut entfernen.Wenn das Ereignis jedoch wie folgt über JavaScript hinzugefügt wurde:
Wir müssen das Ereignis auch über JavaScript entfernen:
In meinem Beispiel habe ich die ID "lyca_login_mobile_no" verwendet, da dies die Texteingabe-ID war, die von der Website verwendet wurde, die ich besuchte.
Eine andere Möglichkeit, das Ereignis zu entfernen (wodurch auch alle Ereignisse entfernt werden), besteht darin, den Knoten zu entfernen und einen neuen zu erstellen, wie wir es tun müssen, wenn
addEventListener
Ereignisse mit einer anonymen Funktion hinzugefügt werden, mit der wir nicht entfernen könnenremoveEventListener
. Dies kann auch über die Browserkonsole erfolgen, indem ein Element überprüft, der HTML-Code kopiert, der HTML-Code entfernt und der HTML-Code an derselben Stelle eingefügt wird.Es kann auch schneller und automatisierter über JavaScript erfolgen:
Update: Wenn die Web-App mit einem JavaScript-Framework wie Angular erstellt wurde, funktionieren die vorherigen Lösungen anscheinend nicht oder beschädigen die App nicht. Eine andere Problemumgehung, um das Einfügen zu ermöglichen, besteht darin, den Wert über JavaScript festzulegen:
Im Moment weiß ich nicht, ob es eine Möglichkeit gibt, alle Ereignisse zur Formularüberprüfung und -beschränkung zu entfernen, ohne eine App zu beschädigen, die vollständig in JavaScript wie Angular geschrieben ist.
quelle
eckig hat eine Polyfüllung für dieses Problem, können Sie überprüfen. Ich habe nicht viel verstanden, aber vielleicht kann es helfen.
const REMOVE_ALL_LISTENERS_EVENT_LISTENER = 'removeAllListeners';
....
quelle
//bearbeiten
Ich wusste nicht, mit welcher Methode Sie Ereignisse anhängen. Denn
addEventListener
Sie können dies verwenden:Weitere Details
quelle
div.onClick = something
dann setzt es ein anderes Ereignis auf Click, aber das vorherige bleibt, also habe ich das vorherige und eines zum Beispiel null ...addEventListener()
.addEventListener()
...Möglicherweise erledigt der Browser dies für Sie, wenn Sie Folgendes tun:
Kopieren Sie das
div
und seine Attribute und fügen Sie es vor dem alten ein. Verschieben Sie dann den Inhalt vom alten zum neuen und löschen Sie den alten?quelle
Entfernen aller Ereignisse am
document
:Einzeiler:
Hübsche Version:
quelle
Nur Chrome
Da ich versuche, einen EventListener innerhalb eines Winkelmessertests zu entfernen und im Test keinen Zugriff auf den Listener habe, werden im Folgenden alle Ereignis-Listener eines einzelnen Typs entfernt:
Ich hoffe, dies hilft jemandem, da die vorherige Antwort die "Entfernen" -Methode verwendet hat, die seitdem nicht mehr funktioniert.
quelle
Sie können einen weiteren Ereignis-Listener hinzufügen und aufrufen
preventDefault()
, um die Weitergabe der vorherigen Listener zu stoppen.quelle
Eine Methode besteht darin, einen neuen Ereignis-Listener hinzuzufügen, der e.stopImmediatePropagation () aufruft.
quelle