【发布时间】:2018-03-14 18:16:55
【问题描述】:
我的 Vue 应用程序中有一个相当简单的组件。当用户打开菜单时,我向#app 元素添加了一个事件监听器来检测“外部”点击。
当用户点击外部时,它会关闭菜单并移除事件监听器。这按预期工作。问题是,当用户单击按钮打开菜单,然后再次单击以关闭菜单时,我也想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不起作用的唯一原因;另一个是在错误的元素,或传递了不同的第三个参数),但如果不离开现场我不能确定。 -
@T.J.Crowder 对不起,我应该知道得更多。我会更新问题。
标签: javascript events vue.js vuejs2