diff --git a/packages/utils/clickoutside.js b/packages/utils/clickoutside.js index 28c8f36a9..0c796aef8 100644 --- a/packages/utils/clickoutside.js +++ b/packages/utils/clickoutside.js @@ -1,38 +1,39 @@ /** * v-clickoutside - * @desc 点击元素外面才会触发的事件 - * @example + * * ```vue - *
+ *
* ``` */ + import Vue from 'vue'; + const isServer = Vue.prototype.$isServer; -const clickoutsideContext = '@@clickoutsideContext'; +const context = '@@clickoutsideContext'; export default { - bind(el, binding, vnode) { - const documentHandler = function(e) { - if (vnode.context && !el.contains(e.target)) { - vnode.context[el[clickoutsideContext].methodName](); + bind(el, binding) { + const handler = event => { + if (!el.contains(event.target)) { + el[context].callback(); } }; - el[clickoutsideContext] = { - documentHandler, - methodName: binding.expression, + + el[context] = { + handler, + callback: binding.value, arg: binding.arg || 'click' }; - !isServer && document.addEventListener(el[clickoutsideContext].arg, documentHandler); + + !isServer && document.addEventListener(el[context].arg, handler); }, update(el, binding) { - el[clickoutsideContext].methodName = binding.expression; + el[context].callback = binding.value; }, unbind(el) { - !isServer && document.removeEventListener( - el[clickoutsideContext].arg, - el[clickoutsideContext].documentHandler); + !isServer && document.removeEventListener(el[context].arg, el[context].handler); }, install(Vue) {