在单击文档时隐藏所有弹出窗口 - 除了单击的那个(事件顺序错误) [英] Hide all popovers on document click - except the one clicked (getting wrong order of events)
问题描述
我正在使用 Vue.js 并且我有一个带天数的日历组件.当您单击一天时,它会显示它的弹出窗口.我试图做到这一点,如果您单击文档中的任何地方,它会隐藏所有弹出窗口.但它不应该隐藏我刚刚打开的那个.
我为文档点击添加了一个事件侦听器,但它在之后触发 Day 组件的 @click 事件.这意味着它会显示当天的弹出框,然后立即隐藏所有弹出框.但它应该首先隐藏所有弹出框,然后才显示当天的弹出框.
HTML
<日历月视图><天></天><天></天><天></天></calendar-month-view>
我的一天组件
出口默认{模板:`<div @click="isVisiblePopover = !isVisiblePopover"><popover v-show="isVisiblePopover"/>
`,成分: {弹出框},数据() {返回 {isVisiblePopover: 假}},安装(){$(document).click(event => {EventBus.$emit('popover-opened')});EventBus.$on('popover-opened', () => {this.isVisiblePopover = false});}};
实现这一点的最简单方法是实现一种布局,放在 popover 后面,作为 Popover
组件的一部分,占据屏幕的 100%(不可见,或者可能具有某种不透明度).然后,您应该处理在单击背面布局时弹出窗口也会关闭的问题,并且没有单击对话框本身.它比处理整个文档中的点击(也处理弹出框点击!)更简单.
这里有一个弹出组件应该是什么样子的示例:
Vue.component('popover', {模板:`<div id="popover-layout" @click="layoutClicked($event)"><div id="popover-dialog" ref="popoverDialog">弹出对话框
`,方法: {布局点击(事件){if(event.target !== this.$refs.popoverDialog) {console.log('关闭弹出框!')}}}});var vm = new Vue({el: '#app'});
#popover-layout {位置:绝对;顶部:0;右:0;底部:0;左:0;不透明度:0.3;背景:银色;}#popover-dialog {宽度:200px;高度:150px;位置:绝对;顶部:50%;左:50%;边距顶部:-75px;左边距:-100px;边框:1px纯黑色;背景:白色;}
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script><div id="应用程序"><popover></popover>