removeEventListener для анонимных функций в JavaScript

У меня есть объект, в котором есть методы. Эти методы помещаются в объект внутри анонимной функции. Это выглядит так:

var t = {};
window.document.addEventListener("keydown", function(e) {
    t.scroll = function(x, y) {
        window.scrollBy(x, y);
    };
    t.scrollTo = function(x, y) {
        window.scrollTo(x, y);
    };
});  

] (кода намного больше, но этого достаточно, чтобы показать проблему)

Теперь я хочу в некоторых случаях остановить прослушиватель событий. Поэтому я пытаюсь выполнить removeEventListener, но не могу понять, как это сделать. сделай это. Я читал в других вопросах, что невозможно вызвать removeEventListener для анонимных функций, но так ли это и в этой ситуации?

У меня есть метод в t, созданный внутри анонимной функции, и поэтому я подумал, что это было возможно. Выглядит так:

t.disable = function() {
    window.document.removeEventListener("keydown", this, false);
}

Почему я не могу это сделать?

Есть ли другой (хороший) способ сделать это?

Дополнительная информация; это должно работать только в Safari, поэтому отсутствует Поддержка IE.

90
задан Brian Tompsett - 汤莱恩 26 August 2019 в 19:17
поделиться

1 ответ

Я знаю, что это - довольно старый поток, но думало, что я мог бы вставить свои два цента для тех, кто находит это полезным.

сценарий (извинения о нетворческих именах методов):

window.Listener = {
    _Active: [],
    remove: function(attached, on, callback, capture){
        for(var i = 0; i < this._Active.length; i++){
            var current = this._Active[i];
            if(current[0] === attached && current[1] === on && current[2] === callback){
                attached.removeEventListener(on, callback, (capture || false));
                return this._Active.splice(i, 1);
            }
        }
    }, removeAtIndex(i){
        if(this._Active[i]){
            var remove = this._Active[i];
            var attached = remove[0], on = remove[1], callback = remove[2];
            attached.removeEventListener(on, callback, false);
            return this._Active.splice(i, 1);
        }
    }, purge: function(){
        for(var i = 0; i < this._Active.length; i++){
            var current = this._Active[i];
            current[0].removeEventListener(current[1], current[2]);
            this._Active.splice(i, 1);
        }
    }, declare: function(attached, on, callback, capture){
        attached.addEventListener(on, callback, (capture || false));
        if(this._Active.push([attached, on, callback])){
            return this._Active.length - 1;
        }
    }
};

И можно использовать его как так:

// declare a new onclick listener attached to the document
var clickListener = Listener.declare(document, "click" function(e){
    // on click, remove the listener and log the clicked element
    console.log(e.target);
    Listener.removeAtIndex(clickListener);
});

// completely remove all active listeners 
// (at least, ones declared via the Listener object)
Listener.purge();

// works exactly like removeEventListener
Listener.remove(element, on, callback);
0
ответ дан 24 November 2019 в 06:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: