Wie kann ich einen JavaScript-Ereignis-Listener entfernen?

Lesezeit: 5 Minuten

Thomas' Benutzer-Avatar
Thomas

Ich versuche, einen Ereignis-Listener innerhalb einer Listener-Definition zu entfernen:

canvas.addEventListener('click', function(event) {
    click++;
    if(click == 50) {
        // remove this event listener here!
    }
// More code here ...

Wie könnte ich das machen? dies = Ereignis…

  • trivial, aber für zukünftige Referenzen if(click == 50) { sollte sein if( click === 50 ) oder if( click >= 50 ) – Sie werden die Ausgabe nicht ändern, aber aus Gründen der Vernunft sind diese Überprüfungen sinnvoller.

    – rlemon

    14. März 2012 um 21:22

  • Gute Frage … wie entferne ich es, wenn ich keinen Zugriff auf den Inhalt habe? Ich möchte Popups für On-Click-Buttons mit Greasemonkey für andere Websites entfernen, aber solange ich die Funktion nicht namentlich referenzieren kann, finde ich anscheinend keine Möglichkeit, sie zu entfernen.

    – JasonXA

    26. Juni 2015 um 19:12 Uhr

Benutzeravatar von user113716
Benutzer113716

Sie müssen benannte Funktionen verwenden.

Auch der click Die Variable muss sich zum Erhöhen außerhalb des Handlers befinden.

var click_count = 0;

function myClick(event) {
    click_count++;
    if(click_count == 50) {
       // to remove
       canvas.removeEventListener('click', myClick);
    }
}

// to add
canvas.addEventListener('click', myClick);

Sie könnten um die herum schließen click_counter Variable wie diese:

var myClick = (function( click_count ) {
    var handler = function(event) {
        click_count++;
        if(click_count == 50) {
           // to remove
           canvas.removeEventListener('click', handler);
        }
    };
    return handler;
})( 0 );

// to add
canvas.addEventListener('click', myClick);

Auf diese Weise können Sie den Zähler über mehrere Elemente hinweg erhöhen.


Wenn Sie das nicht möchten und möchten, dass jeder seinen eigenen Zähler hat, dann gehen Sie wie folgt vor:

var myClick = function( click_count ) {
    var handler = function(event) {
        click_count++;
        if(click_count == 50) {
           // to remove
           canvas.removeEventListener('click', handler);
        }
    };
    return handler;
};

// to add
canvas.addEventListener('click', myClick( 0 ));

  • Upvote, die dritte Option hier ist ein wichtiger Teil des Verständnisses der JS-Bindung/-Entbindung

    – SW4

    19. Mai 2015 um 14:18


  • würde myClick = function(event){...} auch als benannte Funktion betrachtet werden?

    – Daniel Möller

    28. Juli 2015 um 18:35 Uhr

  • Ich frage mich, ob ich Folgendes tun könnte: myClick = function....Dann another = myClick und schlussendlich removeEventListener('click', another) ??

    – Daniel Möller

    28. Juli 2015 um 19:02 Uhr

  • @Daniel seitdem myClick(0) Gibt eine Funktion zurück, natürlich können Sie das

    – alebianco

    20. Dezember 2016 um 9:15 Uhr

  • Beachten Sie, dass dies bereits im Jahr 2010 der Fall war, seit Ende 2020 jedoch nicht mehr der Fall ist, als Kontrollsignale für Ereignisse eingeführt wurden. Du nicht mehr, nicht länger brauchen benannte Funktionen, oder sogar removeEventListener Übrigens: Sie können eine Veranstaltung heutzutage einfach direkt abbrechen.

    – Mike „Pomax“ Kamermans

    27. Juli 2022 um 15:33 Uhr


   canvas.addEventListener('click', function(event) {
      click++;
      if(click == 50) {
          this.removeEventListener('click',arguments.callee,false);
      }

Sollte es tun.

  • Das ist cool! Doc weiter arguments.callee für Interessenten: Developer.mozilla.org/en/JavaScript/Reference/…

    – Ender

    9. Dezember 2010 um 19:48

  • Leider funktioniert dies nicht mit ECMAScript 5 (2009) oder höher, über den MDN-Link: „Die 5. Ausgabe von ECMAScript (ES5) verbietet die Verwendung von arguments.callee() im strengen Modus. Vermeide das Benutzen arguments.callee() indem man Funktionsausdrücken entweder einen Namen gibt oder eine Funktionsdeklaration verwendet, bei der sich eine Funktion selbst aufrufen muss callee() anstatt calleees ist immer noch entfernt, boo!)

    – Dai

    30. Mai 2020 um 2:18

Tamas Benutzeravatar
Tama

Sie könnten einen benannten Funktionsausdruck verwenden (in diesem Fall ist die Funktion benannt). abc), etwa so:

let click = 0;
canvas.addEventListener('click', function abc(event) {
    click++;
    if (click >= 50) {
        // remove event listener function `abc`
        canvas.removeEventListener('click', abc);
    }
    // More code here ...
}

Quick-and-Dirty-Arbeitsbeispiel: http://jsfiddle.net/8qvdmLz5/2/.

Weitere Informationen zu benannten Funktionsausdrücken: http://kangax.github.io/nfe/.

Benutzer-Avatar von Brad Christie
Brad Christie

Wenn die Lösung von @Cybernate nicht funktioniert, versuchen Sie, den Trigger in seine eigene Funktion zu unterteilen, damit Sie darauf verweisen können.

clickHandler = function(event){
  if (click++ == 49)
    canvas.removeEventListener('click',clickHandler);
}
canvas.addEventListener('click',clickHandler);

element.querySelector('.addDoor').onEvent('click', function (e) { });
element.querySelector('.addDoor').removeListeners();


HTMLElement.prototype.onEvent = function (eventType, callBack, useCapture) {
this.addEventListener(eventType, callBack, useCapture);
if (!this.myListeners) {
    this.myListeners = [];
};
this.myListeners.push({ eType: eventType, callBack: callBack });
return this;
};


HTMLElement.prototype.removeListeners = function () {
if (this.myListeners) {
    for (var i = 0; i < this.myListeners.length; i++) {
        this.removeEventListener(this.myListeners[i].eType, this.myListeners[i].callBack);
    };
   delete this.myListeners;
};
};

Offenbar hat niemand den Teil der aktuellen JavaScript-DOM-Spezifikation abgedeckt, der Ihnen einen Mechanismus zum Entfernen Ihres Ereignis-Listeners bietet ohne verwenden removeEventListener. Wenn wir uns ansehen https://dom.spec.whatwg.org/#concept-event-listener Wir sehen, dass es eine Reihe von Eigenschaften gibt, die übergeben werden können, um das Abhören von Ereignissen zu steuern:

{
  type (a string)
  callback (null or an EventListener object)
  capture (a boolean, initially false)
  passive (a boolean, initially false)
  once (a boolean, initially false)
  signal (null or an AbortSignal object)
  removed (a boolean for bookkeeping purposes, initially false) 
}

Nun, es gibt viele nützliche Eigenschaften in dieser Liste, aber zum Entfernen eines Ereignis-Listeners ist es die signal Eigenschaft, die wir nutzen möchten (die dem DOM Level 3 hinzugefügt wurde). Ende 2020), weil wir damit der JS-Engine mitteilen können, einen Ereignis-Listener zu entfernen, indem wir ihn einfach aufrufen abort() anstatt sich darum kümmern zu müssen removeEventListener:

const canvasListener = (new AbortController()).signal;

canvas.addEventListener('click', () => {
  click++;
  if (click === 50) {
    canvasListener.abort();
  } else {
    doSomethingWith(click);
  }
}, {
  signal: canvasListener 
});

(Beachten Sie, dass dies nicht verwendet wird useCapture Flag, da das useCapture-Flag im Wesentlichen völlig nutzlos ist)

Und fertig: Die JS-Engine wird unseren Event-Listener abbrechen und bereinigen. Kein Verweis auf die Bearbeitungsfunktion beibehalten, kein Sicherstellen, dass wir aufrufen removeEventListener mit genau den gleichen Eigenschaften wie wir aufgerufen haben addEventListener: Wir brechen einfach den Listener ab.

Ich denke, Sie müssen die Handler-Funktion möglicherweise im Voraus definieren, etwa so:

var myHandler = function(event) {
    click++; 
    if(click == 50) { 
        this.removeEventListener('click', myHandler);
    } 
}
canvas.addEventListener('click', myHandler);

Dadurch können Sie den Handler anhand seines Namens aus ihm selbst entfernen.

1454560cookie-checkWie kann ich einen JavaScript-Ereignis-Listener entfernen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy