1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
const validate = (binding) => {
if (typeof binding.value !== "function") {
console.warn("[Vue-click-outside:] provided expression", binding.expression, "is not a function.");
return false;
}
return true;
};
const isPopup = (popupItem, elements) => {
if (!popupItem || !elements)
return false;
for (let i = 0, len = elements.length; i < len; i++)
try {
if (popupItem.contains(elements[i]))
return true;
if (elements[i].contains(popupItem))
return false;
}
catch (err) {
return false;
}
return false;
};
const isServer = (vNode) => typeof vNode.componentInstance !== "undefined" &&
vNode.componentInstance.$isServer;
export const bind = (el, binding, vNode) => {
if (!validate(binding))
return;
// Define Handler and cache it on the element
const handler = (event) => {
if (!vNode.context)
return;
// Some components may have related popup item, on which we shall prevent the click outside event handler.
// eslint-disable-next-line
const elements =
// eslint-disable-next-line
event.path ||
(event.composedPath ? event.composedPath() : []);
if (elements && elements.length > 0)
elements.unshift(event.target);
if (el.contains(event.target) ||
// eslint-disable-next-line
isPopup(vNode.context.popupItem, elements))
return;
if (el.$vueClickOutside)
el.$vueClickOutside.callback(event);
};
// Add Event Listeners
el.$vueClickOutside = {
handler,
callback: binding.value,
};
const clickHandler = "ontouchstart" in document.documentElement ? "touchstart" : "click";
if (!isServer(vNode))
document.addEventListener(clickHandler, handler);
};
export const update = (el, binding) => {
if (validate(binding) && el.$vueClickOutside)
el.$vueClickOutside.callback = binding.value;
};
export const unbind = (el, _binding, vNode) => {
// Remove Event Listeners
const clickHandler = "ontouchstart" in document.documentElement ? "touchstart" : "click";
if (!isServer(vNode) && el.$vueClickOutside)
document.removeEventListener(clickHandler, el.$vueClickOutside.handler);
delete el.$vueClickOutside;
};
export default {
bind,
update,
unbind,
};
//# sourceMappingURL=click-outside.js.map