diff --git a/src/client/components/user-preview.vue b/src/client/components/user-preview.vue index 7637f700d..89150eaac 100644 --- a/src/client/components/user-preview.vue +++ b/src/client/components/user-preview.vue @@ -53,6 +53,7 @@ export default Vue.extend({ return { u: null, show: false, + closed: false, top: 0, left: 0, }; @@ -68,6 +69,7 @@ export default Vue.extend({ { userId: this.user }; this.$root.api('users/show', query).then(user => { + if (this.closed) return; this.u = user; this.show = true; }); @@ -83,6 +85,7 @@ export default Vue.extend({ methods: { close() { + this.closed = true; this.show = false; if (this.$refs.content) (this.$refs.content as any).style.pointerEvents = 'none'; } diff --git a/src/client/directives/user-preview.ts b/src/client/directives/user-preview.ts index 3c5bd3510..4db0d67c4 100644 --- a/src/client/directives/user-preview.ts +++ b/src/client/directives/user-preview.ts @@ -39,11 +39,15 @@ export default { self.hideTimer = setTimeout(self.close, 500); }); - self.checkTimer = setInterval(() => { - if (!document.body.contains(el)) self.close(); - }, 1000); - document.body.appendChild(self.tag.$el); + + self.checkTimer = setInterval(() => { + if (!document.body.contains(el)) { + clearTimeout(self.showTimer); + clearTimeout(self.hideTimer); + self.close(); + } + }, 1000); }; el.addEventListener('mouseover', () => { @@ -66,9 +70,6 @@ export default { unbind(el, binding, vn) { const self = el._userPreviewDirective_; - clearTimeout(self.showTimer); - clearTimeout(self.hideTimer); clearInterval(self.checkTimer); - self.close(); } };