在 Vue 中使用 window.addEventListener 多次触发事件
Event fired multiple times with window.addEventListener in Vue
我的 Vue 组件中有这个 html 代码
<div id="stats" class="" @click="clickOutside()">
<ArticleStats
:article="article"
class="tw-mt-5 tw-hidden md:tw-flex"
/>
<div
@click="$router.push('/article/' + article.content_content_id)"
class="
tw-mt-5 tw-block tw-text-center tw-text-sm
md:tw-text-base
tw-cursor-pointer
tw-text-white
tw-p-2
tw-rounded-2xl
tw-w-full
tw-bg-red-400
hover:tw-bg-red-600 hover:tw-text-white
"
>
Leer más
</div>
</div>
clickOutside() 方法是这样的:
clickOutside() {
console.log('hola')
window.addEventListener("mouseup", (e) => {
console.log(e);
const clickedE1 = e.target;
if (this.$el.contains(clickedE1)) {
console.log("inside");
} else {
console.log("outside");
}
});
},
但是当我点击它时 div 事件被多次触发,这是控制台中单击一次的响应:
有人可能知道如何解决它或为什么会这样吗?
这是由元素及其子元素触发的,因此您应该添加 self
修饰符以防止该行为:
<div id="stats" class="" @click.self="clickOutside()">
有关详细信息,请查看此 https://vuejs.org/guide/essentials/event-handling.html#event-modifiers
我最后做的是在创建的钩子上创建一个事件监听器,在销毁的钩子上移除它,并添加一个检测目标的方法,这样:
created() {
window.addEventListener("mouseup", this.onMouseUp);
},
destroyed() {
window.removeEventListener("mouseup", this.onMouseUp);
},
methods: {
onMouseUp(e) {
const clickedE1 = e.target;
if (this.$el.contains(clickedE1)) {
console.log("inside");
} else {
console.log("outside");
}
},
},
仅此而已,它终于按我想要的方式工作了。感谢您的回复。
我的 Vue 组件中有这个 html 代码
<div id="stats" class="" @click="clickOutside()">
<ArticleStats
:article="article"
class="tw-mt-5 tw-hidden md:tw-flex"
/>
<div
@click="$router.push('/article/' + article.content_content_id)"
class="
tw-mt-5 tw-block tw-text-center tw-text-sm
md:tw-text-base
tw-cursor-pointer
tw-text-white
tw-p-2
tw-rounded-2xl
tw-w-full
tw-bg-red-400
hover:tw-bg-red-600 hover:tw-text-white
"
>
Leer más
</div>
</div>
clickOutside() 方法是这样的:
clickOutside() {
console.log('hola')
window.addEventListener("mouseup", (e) => {
console.log(e);
const clickedE1 = e.target;
if (this.$el.contains(clickedE1)) {
console.log("inside");
} else {
console.log("outside");
}
});
},
但是当我点击它时 div 事件被多次触发,这是控制台中单击一次的响应:
有人可能知道如何解决它或为什么会这样吗?
这是由元素及其子元素触发的,因此您应该添加 self
修饰符以防止该行为:
<div id="stats" class="" @click.self="clickOutside()">
有关详细信息,请查看此 https://vuejs.org/guide/essentials/event-handling.html#event-modifiers
我最后做的是在创建的钩子上创建一个事件监听器,在销毁的钩子上移除它,并添加一个检测目标的方法,这样:
created() {
window.addEventListener("mouseup", this.onMouseUp);
},
destroyed() {
window.removeEventListener("mouseup", this.onMouseUp);
},
methods: {
onMouseUp(e) {
const clickedE1 = e.target;
if (this.$el.contains(clickedE1)) {
console.log("inside");
} else {
console.log("outside");
}
},
},
仅此而已,它终于按我想要的方式工作了。感谢您的回复。