UNPKG

bk-magic-vue

Version:

基于蓝鲸 Magicbox 和 Vue 的前端组件库

74 lines (69 loc) 2.5 kB
(function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : typeof define === 'function' && define.amd ? define(['exports'], factory) : (global = global || self, factory(global.library = {})); }(this, function (exports) { 'use strict'; var nodeList = []; var clickctx = '$clickoutsideCtx'; var beginClick; var seed = 0; document.addEventListener('mousedown', function (event) { return beginClick = event; }); document.addEventListener('mouseup', function (event) { nodeList.forEach(function (node) { node[clickctx].clickoutsideHandler(event, beginClick); }); }); var bkClickoutside = { bind: function bind(el, binding, vnode) { nodeList.push(el); var id = seed++; var clickoutsideHandler = function clickoutsideHandler() { var mouseup = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var mousedown = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; if (!vnode.context || !mouseup.target || !mousedown.target || el.contains(mouseup.target) || el.contains(mousedown.target) || el === mouseup.target || vnode.context.popup && (vnode.context.popup.contains(mouseup.target) || vnode.context.popup.contains(mousedown.target) )) { return; } if (binding.expression && el[clickctx].callbackName && vnode.context[el[clickctx].callbackName] ) { vnode.context[el[clickctx].callbackName](mouseup, mousedown, el); } else { el[clickctx].bindingFn && el[clickctx].bindingFn(mouseup, mousedown, el); } }; el[clickctx] = { id: id, clickoutsideHandler: clickoutsideHandler, callbackName: binding.expression, callbackFn: binding.value }; }, update: function update(el, binding) { el[clickctx].callbackName = binding.expression; el[clickctx].callbackFn = binding.value; }, unbind: function unbind(el) { for (var i = 0, len = nodeList.length; i < len; i++) { if (nodeList[i][clickctx].id === el[clickctx].id) { nodeList.splice(i, 1); break; } } } }; bkClickoutside.install = function (Vue) { Vue.directive('bkClickoutside', bkClickoutside); }; exports.default = bkClickoutside; Object.defineProperty(exports, '__esModule', { value: true }); }));