2012-03-29 11 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', arguments.callee, false);の代わりに

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

を使用したが運がなかったしました。

ご協力いただきありがとうございます。

+0

不要なクロージャを簡略化します。(function(obj){return {function}){obj.removeSpan();})(this) - > function(obj){obj.removeSpan(); } – sergzach

+0

あなたの例では、objはクラスではなくイベントを参照します。 – Rich

+0

なぜremoveEventListerからremoveSpanを呼び出そうとしていますか? 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')); 

、私がobj.removeSpan(this);removeSpanに私がelと受け取ったので、私がel.removeEventListenerをやったことができたので、それを助けることを望んだので、オブジェクトを渡す。

また、ここでexampleがある代わりに

MyClass.prototype.listener=null; 

のこの

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

を行うことができます。

+0

クールなことは素晴らしいです、助けてくれてありがとう) – Rich

+0

あなたは歓迎です:-) –

0

イベントハンドラをこれに変更してみてください。私はまた、MyClassのプロトタイプにプロパティ(リスナー)を添加し、次いでreturn obj.listenerなどの基準を返され、また、あなたが必要としました

あなたがそれを削除することはできませんリスナーの参照がなければ
span.addEventListener('click', (function (obj) { 

     span.onclick = null; 

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

私は元の場所に置いてみましたが、残念ながら運はありませんでした:( – Rich

関連する問題