vue-easytable
Version:
80 lines (70 loc) • 2.49 kB
JavaScript
/*
events outside
desc:绑定元素触发的事件不在指定事件中,将会触发。此指令可替代 clickoutside
--------------------vue 模板用法如下:-----------------------------------
<tempate>
<button v-events-outside="{
events:["mousedown","mouseover"],
callback:(e)=>{} //
}">删除</button>
</tempate>
--------------------vue jsx 用法如下:-----------------------------------
<script>
export default{
render(){
const props = {
directives: [
{
name: "events-outside",
value: {
events: ["mousedown","mouseover"],
callback: (e) => {
//
},
},
}
]
};
return (
<div>
<button {...props}>删除</button>
</div>
)
}
}
</script>
*/
export default {
bind: function (el, binding, vNode) {
const { events, callback } = binding.value;
if (
Array.isArray(events) &&
events.length &&
typeof callback === "function"
) {
const handler = (e) => {
if (!el.contains(e.target) && el !== e.target) {
callback(e);
} else {
return false;
}
};
el.__eventsOutside__ = handler;
events.forEach((eventName) => {
document.addEventListener(eventName, handler, true);
});
} else {
const compName = vNode.context.name;
console.error(
`[events-outside] Please provided 'events' and 'callback' in ${compName}`,
);
}
},
unbind: function (el, binding, vNode) {
const { events } = binding.value;
events.forEach((eventName) => {
document.removeEventListener(eventName, el.__eventsOutside__, true);
});
el.__eventsOutside__ = null;
},
};