私のVueアプリケーションにはかなり単純なコンポーネントがあります。ユーザーがメニューを開くと、イベントリスナーを#app
要素に追加して、「外側」のクリックを検出します。removeEventListenerが期待どおりに動作しない
ユーザーが外部をクリックすると、メニューが閉じられ、イベントリスナーが削除されます。これは期待どおりに動作しています。問題は、ユーザーがメニューを開くためにボタンをクリックし、メニューを閉じるためにもう一度クリックすると、はremoveEventListener
になります。
これは機能しません。ボタンを介してメニューを開き、ボタンを押して閉じると、イベントリスナは削除しても#app
要素に残ります。
ボタンを複数回クリックしてから、値がtrue
と表示されている間にボタンの外側をクリックすると、コンソールログoutside click
が複数回表示されます。
new Vue({
el: "#app",
data: {
menuVisible: false
},
methods: {
click(e) {
var clickSource = e.target;
var app = document.getElementById("app");
var that = this;
function clickOutside(e) {
if (e.target != clickSource) {
console.log("outside click");
that.menuVisible = false;
app.removeEventListener("click", clickOutside);
}
}
if (this.menuVisible === false) {
this.menuVisible = true;
app.addEventListener("click", clickOutside);
} else if (this.menuVisible === true) {
this.menuVisible = false;
app.removeEventListener("click", clickOutside);
}
}
}
});
body {
margin: 0;
}
#app {
min-height: 100vh;
}
<script src="https://unpkg.com/vue"></script>
<div id="app">
{{menuVisible}}
<button @click="click">
click
</button>
</div>
、あなたはそれがほぼ 'removeEventListener'が働かない唯一の理由だ' addEventListener'(に渡さremoveEventListener' 'に同じ機能を渡していない。他のさ間違った要素で呼び出すか、別の第3引数を渡す)、オフサイトに出ることなく、私は確信が持てません。 –
@ T.J.Crowder申し訳ありませんが、私はよく知っている必要があります。私は質問を更新します。 – justinw