From 9bb604610ca5df95090cee4ae3d71a5ce016407b Mon Sep 17 00:00:00 2001 From: mengxiong10 <15623530290@163.com> Date: Tue, 9 Apr 2019 20:39:04 +0800 Subject: [PATCH] fix: clickoutside bad when use append-to-body (#291) --- src/directives/clickoutside.js | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/src/directives/clickoutside.js b/src/directives/clickoutside.js index d1d742ee..58d4deed 100644 --- a/src/directives/clickoutside.js +++ b/src/directives/clickoutside.js @@ -1,19 +1,33 @@ +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 ( - !el.contains(e.target) && - !(vnode.context.popupElm && vnode.context.popupElm.contains(e.target)) && + 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('click', el['@clickoutside'], false) + document.addEventListener('mousedown', handleMouseDown) + document.addEventListener('mouseup', el['@clickoutside']) }, unbind (el) { - document.removeEventListener('click', el['@clickoutside'], false) + document.removeEventListener('mousedown', handleMouseDown) + document.removeEventListener('mouseup', el['@clickoutside']) } }