diff --git a/components/vc-dialog/Dialog.jsx b/components/vc-dialog/Dialog.jsx
index ef0bae4ce..2e6e8ad90 100644
--- a/components/vc-dialog/Dialog.jsx
+++ b/components/vc-dialog/Dialog.jsx
@@ -46,6 +46,8 @@ function offset(el) {
return pos;
}
+let cacheOverflow = {};
+
export default {
mixins: [BaseMixin],
props: initDefaultProps(IDialogPropTypes, {
@@ -57,6 +59,7 @@ export default {
destroyOnClose: false,
prefixCls: 'rc-dialog',
getOpenCount: () => null,
+ focusTriggerAfterClose: true,
}),
data() {
return {
@@ -81,16 +84,6 @@ export default {
},
},
- // private inTransition: boolean;
- // private titleId: string;
- // private openTime: number;
- // private lastOutSideFocusNode: HTMLElement | null;
- // private wrap: HTMLElement;
- // private dialog: any;
- // private sentinel: HTMLElement;
- // private bodyIsOverflowing: boolean;
- // private scrollbarWidth: number;
-
beforeMount() {
this.inTransition = false;
this.titleId = `rcDialogTitle${uuid++}`;
@@ -107,7 +100,7 @@ export default {
beforeDestroy() {
const { visible, getOpenCount } = this;
if ((visible || this.inTransition) && !getOpenCount()) {
- this.removeScrollingEffect();
+ this.switchScrollingEffect();
}
clearTimeout(this.timeoutId);
},
@@ -118,12 +111,13 @@ export default {
},
updatedCallback(visible) {
const mousePosition = this.mousePosition;
+ const {mask, focusTriggerAfterClose} = this;
if (this.visible) {
// first show
if (!visible) {
this.openTime = Date.now();
// this.lastOutSideFocusNode = document.activeElement
- this.addScrollingEffect();
+ this.switchScrollingEffect();
// this.$refs.wrap.focus()
this.tryFocus();
const dialogNode = this.$refs.dialog.$el;
@@ -139,7 +133,7 @@ export default {
}
} else if (visible) {
this.inTransition = true;
- if (this.mask && this.lastOutSideFocusNode) {
+ if (mask && this.lastOutSideFocusNode && focusTriggerAfterClose) {
try {
this.lastOutSideFocusNode.focus();
} catch (e) {
@@ -166,7 +160,7 @@ export default {
this.destroyPopup = true;
}
this.inTransition = false;
- this.removeScrollingEffect();
+ this.switchScrollingEffect();
if (afterClose) {
afterClose();
}
@@ -224,6 +218,7 @@ export default {
bodyStyle,
visible,
bodyProps,
+ forceRender,
} = this;
const dest = {};
if (width !== undefined) {
@@ -284,6 +279,7 @@ export default {
ref="dialog"
style={style}
class={cls}
+ forceRender={forceRender}
onMousedown={this.onDialogMouseDown}
>
@@ -369,60 +365,50 @@ export default {
// document.body.style.paddingRight = `${this.scrollbarWidth}px`;
// }
// },
- addScrollingEffect() {
+ switchScrollingEffect() {
const { getOpenCount } = this;
const openCount = getOpenCount();
- if (openCount !== 1) {
- return;
- }
- switchScrollingEffect();
- document.body.style.overflow = 'hidden';
- },
- removeScrollingEffect() {
- const { getOpenCount } = this;
- const openCount = getOpenCount();
- if (openCount !== 0) {
- return;
+ if (openCount === 1) {
+ if (cacheOverflow.hasOwnProperty('overflowX')) {
+ return;
+ }
+ cacheOverflow = {
+ overflowX: document.body.style.overflowX,
+ overflowY: document.body.style.overflowY,
+ overflow: document.body.style.overflow,
+ };
+ switchScrollingEffect();
+ // Must be set after switchScrollingEffect
+ document.body.style.overflow = 'hidden';
+ } else if (!openCount) {
+ // IE browser doesn't merge overflow style, need to set it separately
+ // https://github.com/ant-design/ant-design/issues/19393
+ if (cacheOverflow.overflow !== undefined) {
+ document.body.style.overflow = cacheOverflow.overflow;
+ }
+ if (cacheOverflow.overflowX !== undefined) {
+ document.body.style.overflowX = cacheOverflow.overflowX;
+ }
+ if (cacheOverflow.overflowY !== undefined) {
+ document.body.style.overflowY = cacheOverflow.overflowY;
+ }
+ cacheOverflow = {};
+ switchScrollingEffect(true);
}
- document.body.style.overflow = '';
- switchScrollingEffect(true);
- // this.resetAdjustments();
},
+ // removeScrollingEffect() {
+ // const { getOpenCount } = this;
+ // const openCount = getOpenCount();
+ // if (openCount !== 0) {
+ // return;
+ // }
+ // document.body.style.overflow = '';
+ // switchScrollingEffect(true);
+ // // this.resetAdjustments();
+ // },
close(e) {
this.__emit('close', e);
},
- // checkScrollbar() {
- // let fullWindowWidth = window.innerWidth;
- // if (!fullWindowWidth) {
- // // workaround for missing window.innerWidth in IE8
- // const documentElementRect = document.documentElement.getBoundingClientRect();
- // fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left);
- // }
- // this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth;
- // if (this.bodyIsOverflowing) {
- // this.scrollbarWidth = getScrollBarSize();
- // }
- // },
- // resetScrollbar() {
- // document.body.style.paddingRight = '';
- // },
- // adjustDialog() {
- // if (this.$refs.wrap && this.scrollbarWidth !== undefined) {
- // const modalIsOverflowing =
- // this.$refs.wrap.scrollHeight > document.documentElement.clientHeight;
- // this.$refs.wrap.style.paddingLeft = `${
- // !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : ''
- // }px`;
- // this.$refs.wrap.style.paddingRight = `${
- // this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : ''
- // }px`;
- // }
- // },
- // resetAdjustments() {
- // if (this.$refs.wrap) {
- // this.$refs.wrap.style.paddingLeft = this.$refs.wrap.style.paddingLeft = '';
- // }
- // },
},
render() {
const { prefixCls, maskClosable, visible, wrapClassName, title, wrapProps } = this;
@@ -433,7 +419,7 @@ export default {
style.display = null;
}
return (
-