2016-06-29 8 views
1

removeEventが機能しない理由を教えてください。removeEventListenerが呼び出された後でbodyをクリックしてください。私はそれをより分かりやすくするために単純にします。
p - プロパティとメソッドを持つオブジェクト。
p.is_open - true/falseプロパティ。
p.switcher - DOM要素。javascriptを使用してイベントリスナーを削除することはできません

function MyClassname(){ 
    ....... 
    p.switcher.onclick = function(e){ 
    if(p.is_open){ 
     p.close(); 
     document.body.removeEventListener('click', p.close.bind(p)); 
    }else{ 
     p.open(); 
     document.body.addEventListener('click', p.close.bind(p)); 
    }; 
    e.stopPropagation(); 
    }; 
    ....... 
}; 
....... 
MyClassname.prototype.close = function(){ 
    var p = this; 
    p.is_open = false; 
    p.switcher.className = 'closed'; 
}; 
MyClassname.prototype.open = function(){ 
    var p = this; 
    p.is_open = true; 
    p.switcher.className = 'open'; 
}; 

私はこのタスクを別の方法で解決できますが、問題を解決したいと思います。おかげさまで

+0

'p.close.bind(p)'を変数に保存する必要があります。あなたの '関数MyClassname()'の中に 'var closeHandler = p.close.bind(p);'のようなものがあります。次に、 'document.body.addEventListener( 'click'、closeHandler);'と 'document.body.addEventListener( 'click'、closeHandler);'を実行します。 '.bind()'メソッドを使用すると、同じ本体を持つ**新しい**関数が作成されます。したがって、**新しい**機能が追加されていないため、削除できません。 '.bind()'を実行するたびに、完全に新しいオブジェクトです。 'var a = function(){};を実行してみてください。 console.log(a.bind(a)=== a.bind(a)); 'をブラウザのコンソールに表示します。 –

+0

ありがとうございました。 – WeekendMan

+0

ようこそ。私はそれを答えに変換します。 –

答えて

0

p.close.bind(p)を変数に格納する必要があるため、イベントリスナーを削除することはできません。このような
何か:

function MyClassname(){ 
    var closeHandler = p.close.bind(p); 
    ....... 
    p.switcher.onclick = function(e){ 
    if(p.is_open){ 
     p.close(); 
     document.body.removeEventListener('click', closeHandler); 
    }else{ 
     p.open(); 
     document.body.addEventListener('click', closeHandler); 
    }; 
    e.stopPropagation(); 
    }; 
    ....... 
}; 
....... 
MyClassname.prototype.close = function(){ 
    var p = this; 
    p.is_open = false; 
    p.switcher.className = 'closed'; 
}; 
MyClassname.prototype.open = function(){ 
    var p = this; 
    p.is_open = true; 
    p.switcher.className = 'open'; 
}; 

ビットp.close.bind(p)同じ体で新しい関数を作成ウィル。
完全に新しいオブジェクトです。 2つの異なるオブジェクトを比較すると、falseが返されます。

一部MDNを引用

についてthe .bind() method

bind()メソッドが呼び出され、新しい関数を作成し、[...]提供された値に設定され、このキーワードがあります。


ここでは例です:

var button = document.getElementsByTagName('button')[0]; 
 

 
var handler = function(){ 
 
    console.log('click'); 
 
    //this refers to the button 
 
    this.removeEventListener('click', handler.bind(this)); 
 
}; 
 

 
button.addEventListener('click', handler.bind(button));
<button>Click me</button>

あなたが見ることができるように、クリックが残ります。ここでもう一つの例だ:変数内.bind()の結果を保存する

var button = document.getElementsByTagName('button')[0]; 
 

 
var handler = (function(){ 
 
    console.log('click'); 
 
    //this refers to the button 
 
    this.removeEventListener('click', handler); 
 
}).bind(button); 
 

 
button.addEventListener('click', handler);
<button>Click me</button>

は、あなたが望むようにあなたが行うことができます、そしてあなたは、まったく同じオブジェクトを参照のうえされています。

関連する問題