From 784b2797383a0763f63260863f1f189d0c1ace93 Mon Sep 17 00:00:00 2001 From: neverland Date: Fri, 22 Mar 2019 16:16:35 +0800 Subject: [PATCH] [bugfix] Dialog: overlay incorrect locate when use getContainer (#3041) --- packages/mixins/popup/context.ts | 1 - packages/mixins/popup/index.js | 6 +++++- packages/mixins/popup/overlay.ts | 22 +++++++++++----------- packages/toast/index.js | 6 ++++-- 4 files changed, 20 insertions(+), 15 deletions(-) diff --git a/packages/mixins/popup/context.ts b/packages/mixins/popup/context.ts index 3da90ea7d..b19551c3a 100644 --- a/packages/mixins/popup/context.ts +++ b/packages/mixins/popup/context.ts @@ -2,7 +2,6 @@ import { OverlayConfig } from './overlay'; export type StackItem = { vm: any; - target: HTMLElement; config: OverlayConfig; }; diff --git a/packages/mixins/popup/index.js b/packages/mixins/popup/index.js index 97a137f71..4519ffcf9 100644 --- a/packages/mixins/popup/index.js +++ b/packages/mixins/popup/index.js @@ -1,7 +1,7 @@ import { context } from './context'; import { TouchMixin } from '../touch'; import { on, off } from '../../utils/event'; -import { openOverlay, closeOverlay } from './overlay'; +import { openOverlay, closeOverlay, updateOverlay } from './overlay'; import { getScrollEventTarget } from '../../utils/scroll'; export const PopupMixin = { @@ -154,6 +154,10 @@ export const PopupMixin = { if (container && container !== this.$el.parentNode) { container.appendChild(this.$el); } + + if (this.overlay) { + updateOverlay(); + } }, onTouchMove(e) { diff --git a/packages/mixins/popup/overlay.ts b/packages/mixins/popup/overlay.ts index 9ea07a128..f2600e79b 100644 --- a/packages/mixins/popup/overlay.ts +++ b/packages/mixins/popup/overlay.ts @@ -31,7 +31,7 @@ function onClickOverlay(): void { } } -function updateOverlay(): void { +export function updateOverlay(): void { if (!overlay) { overlay = mount(Overlay, { on: { @@ -40,26 +40,26 @@ function updateOverlay(): void { }); } - if (overlay.$el.parentNode) { - overlay.visible = false; - } - if (context.top) { - const { target, config } = context.top; + const { vm, config } = context.top; + + const el = vm.$el; + const target = el && el.parentNode ? el.parentNode : document.body; + if (target) { + target.appendChild(overlay.$el); + } - target.appendChild(overlay.$el); Object.assign(overlay, defaultConfig, config, { visible: true }); + } else { + overlay.visible = false; } } export function openOverlay(vm: any, config: OverlayConfig): void { - /* istanbul ignore next */ if (!context.stack.some(item => item.vm === vm)) { - const el = vm.$el; - const target = el && el.parentNode ? el.parentNode : document.body; - context.stack.push({ vm, config, target }); + context.stack.push({ vm, config }); updateOverlay(); } } diff --git a/packages/toast/index.js b/packages/toast/index.js index 011fd21f2..1c59815fd 100644 --- a/packages/toast/index.js +++ b/packages/toast/index.js @@ -60,9 +60,11 @@ function Toast(options = {}) { clearTimeout(toast.timer); queue = queue.filter(item => item !== toast); - if (document.body.contains(toast.$el)) { - document.body.removeChild(toast.$el); + const parent = toast.$el.parentNode; + if (parent) { + parent.removeChild(toast.$el); } + toast.$destroy(); } }