bk-magic-vue
Version:
基于蓝鲸 Magicbox 和 Vue 的前端组件库
74 lines (69 loc) • 2.5 kB
JavaScript
(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 });
}));