2012-03-29 2 views
2

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

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);, но не везло.

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

+0

Упростить ненужное закрытие: (function (obj) {return function() {obj.removeSpan();}) (this) -> function (obj) {obj.removeSpan(); } – sergzach

+0

В вашем примере obj будет ссылаться на событие, а не на класс. – Rich

+0

Почему вы пытаетесь вызвать removeSpan из removeEventLister? Ваш removeEventListener вызывает removeSpan. Это бесконечная рекурсия. – sergzach

ответ

4
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; 

Вот example.

+0

Прохладный, отлично работает, спасибо за помощь :) – Rich

+0

Добро пожаловать :-) –

0

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

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

     span.onclick = null; 

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

Я попробовал поставить это вместо оригинала, но, к сожалению, не удалось :( – Rich

Смежные вопросы