Удаление прослушивателей событий с помощью анонимных вызовов функций в JavaScript - PullRequest
2 голосов
/ 29 марта 2012

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

var MyClass = function () {}

MyClass.prototype.addSpan = function (el) {
    var span = document.createElement('span');
    span.innerHTML = "Text here";
    el.appendChild(span);
    span.addEventListener('click', (function (obj) { 
        return function () { 
            obj.removeSpan(); 
        }
    })(this), false);
}

MyClass.prototype.removeSpan = function () {
    alert('removing span');
    this.removeEventListener('click', arguments.callee, false);
    // .... remove span .... 
}

myclass = new MyClass();

myclass.addSpan(document.getElementById('box'));

Я также использовал

this.removeEventListener('click', (function (obj) { 
    return function () { 
        obj.removeSpan(); 
    }
})(this), false);

вместо this.removeEventListener('click', arguments.callee, false);, но безуспешно.

Любая помощь очень ценится!

Ответы [ 2 ]

4 голосов
/ 29 марта 2012
var MyClass = function () {}
MyClass.prototype.listener=null;
MyClass.prototype.addSpan = function (el) {
    var span = document.createElement('span');
    span.innerHTML = "Text here";
    el.appendChild(span);
    span.addEventListener('click', (function (obj) { 
        return obj.listener = function () { 
            obj.removeSpan(this); // here 'this' refers to 'span'
        }
    })(this), false);
}

MyClass.prototype.removeSpan = function (el) {
    alert('removing span');
    el.removeEventListener('click', this.listener, false);
    // .... remove span .... 
}

myclass = new MyClass();
myclass.addSpan(document.getElementById('box'));

Без ссылки на слушателя вы не сможете удалить его, поэтому я также добавил свойство (слушатель) в прототип MyClass, а затем возвратил ссылку как return obj.listener, а также вам нужно передатьобъект, который я передал, obj.removeSpan(this); и в removeSpan, который я получил с el, чтобы я мог сделать el.removeEventListener, надеюсь, это поможет.

Вы также можете сделать это

var MyClass = function () {this.listener=null;}

вместо

MyClass.prototype.listener=null;

Вот пример .

0 голосов
/ 29 марта 2012

Попробуйте изменить свой обработчик событий на это.

span.addEventListener('click', (function (obj) { 

        span.onclick = null;

        return function () { 
            obj.removeSpan(); 
        }
    })(this), false);
...