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';
};
私はこのタスクを別の方法で解決できますが、問題を解決したいと思います。おかげさまで
'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)); 'をブラウザのコンソールに表示します。 –
ありがとうございました。 – WeekendMan
ようこそ。私はそれを答えに変換します。 –