From d9619f815c6a87052b353b800c7e597a8dea816a Mon Sep 17 00:00:00 2001 From: mengxiong10 <15623530290@163.com> Date: Mon, 14 Oct 2019 10:56:29 +0800 Subject: [PATCH] fix: the clickoutside don't work sometimes (#326) --- src/directives/clickoutside.js | 33 --------------------------------- src/index.vue | 32 +++++++++++++++++++++++++++----- 2 files changed, 27 insertions(+), 38 deletions(-) delete mode 100644 src/directives/clickoutside.js diff --git a/src/directives/clickoutside.js b/src/directives/clickoutside.js deleted file mode 100644 index 58d4dee..0000000 --- a/src/directives/clickoutside.js +++ /dev/null @@ -1,33 +0,0 @@ -let mouseDownTarget - -const handleMouseDown = evt => (mouseDownTarget = evt.target) - -export default { - bind (el, binding, vnode) { - el['@clickoutside'] = e => { - const mouseUpTarget = e.target - const popupElm = vnode && vnode.context && vnode.context.popupElm - if ( - mouseDownTarget && - mouseUpTarget && - !el.contains(mouseUpTarget) && - !el.contains(mouseDownTarget) && - !( - popupElm && - (popupElm.contains(mouseDownTarget) || - popupElm.contains(mouseUpTarget)) - ) && - binding.expression && - vnode.context[binding.expression] - ) { - binding.value() - } - } - document.addEventListener('mousedown', handleMouseDown) - document.addEventListener('mouseup', el['@clickoutside']) - }, - unbind (el) { - document.removeEventListener('mousedown', handleMouseDown) - document.removeEventListener('mouseup', el['@clickoutside']) - } -} diff --git a/src/index.vue b/src/index.vue index d08cb44..62e402e 100644 --- a/src/index.vue +++ b/src/index.vue @@ -8,7 +8,7 @@ :style="{ 'width': computedWidth }" - v-clickoutside="closePopup"> + >
import fecha from 'fecha' -import clickoutside from '@/directives/clickoutside' import { isValidDate, isValidRangeDate, isDateObejct, isPlainObject, formatDate, parseDate, throttle } from '@/utils/index' import { transformDate } from '@/utils/transform' import CalendarPanel from './calendar.vue' @@ -127,9 +126,6 @@ export default { name: 'DatePicker', components: { CalendarPanel }, mixins: [locale], - directives: { - clickoutside - }, props: { value: null, valueType: { @@ -345,6 +341,30 @@ export default { this.popupElm = this.$refs.calendar document.body.appendChild(this.popupElm) } + // clickoutside close popup + let mousedownTarget + this._bindDocmentMousedown = evt => { + mousedownTarget = evt.target + } + this._bindDocumentMouseup = evt => { + const mouseupTarget = evt.target + const el = this.$el + const { popupElm } = this + if ( + !mousedownTarget || + !mouseupTarget || + el.contains(mousedownTarget) || + el.contains(mouseupTarget) || + (popupElm && (popupElm.contains(mousedownTarget) || popupElm.contains(mouseupTarget))) + ) { + return + } + this.closePopup() + mousedownTarget = null + } + document.addEventListener('mousedown', this._bindDocmentMousedown) + document.addEventListener('mouseup', this._bindDocumentMouseup) + this._displayPopup = throttle(() => { if (this.popupVisible) { this.displayPopup() @@ -357,6 +377,8 @@ export default { if (this.popupElm && this.popupElm.parentNode === document.body) { document.body.removeChild(this.popupElm) } + document.removeEventListener('mousedown', this._bindDocmentMousedown) + document.removeEventListener('mouseup', this._bindDocumentMouseup) window.removeEventListener('resize', this._displayPopup) window.removeEventListener('scroll', this._displayPopup) },