index.mjs 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. import { isClient } from '@vueuse/core';
  2. import '../../utils/index.mjs';
  3. import { isElement } from '../../utils/types.mjs';
  4. const nodeList = /* @__PURE__ */ new Map();
  5. let startClick;
  6. if (isClient) {
  7. document.addEventListener("mousedown", (e) => startClick = e);
  8. document.addEventListener("mouseup", (e) => {
  9. for (const handlers of nodeList.values()) {
  10. for (const { documentHandler } of handlers) {
  11. documentHandler(e, startClick);
  12. }
  13. }
  14. });
  15. }
  16. function createDocumentHandler(el, binding) {
  17. let excludes = [];
  18. if (Array.isArray(binding.arg)) {
  19. excludes = binding.arg;
  20. } else if (isElement(binding.arg)) {
  21. excludes.push(binding.arg);
  22. }
  23. return function(mouseup, mousedown) {
  24. const popperRef = binding.instance.popperRef;
  25. const mouseUpTarget = mouseup.target;
  26. const mouseDownTarget = mousedown == null ? void 0 : mousedown.target;
  27. const isBound = !binding || !binding.instance;
  28. const isTargetExists = !mouseUpTarget || !mouseDownTarget;
  29. const isContainedByEl = el.contains(mouseUpTarget) || el.contains(mouseDownTarget);
  30. const isSelf = el === mouseUpTarget;
  31. const isTargetExcluded = excludes.length && excludes.some((item) => item == null ? void 0 : item.contains(mouseUpTarget)) || excludes.length && excludes.includes(mouseDownTarget);
  32. const isContainedByPopper = popperRef && (popperRef.contains(mouseUpTarget) || popperRef.contains(mouseDownTarget));
  33. if (isBound || isTargetExists || isContainedByEl || isSelf || isTargetExcluded || isContainedByPopper) {
  34. return;
  35. }
  36. binding.value(mouseup, mousedown);
  37. };
  38. }
  39. const ClickOutside = {
  40. beforeMount(el, binding) {
  41. if (!nodeList.has(el)) {
  42. nodeList.set(el, []);
  43. }
  44. nodeList.get(el).push({
  45. documentHandler: createDocumentHandler(el, binding),
  46. bindingFn: binding.value
  47. });
  48. },
  49. updated(el, binding) {
  50. if (!nodeList.has(el)) {
  51. nodeList.set(el, []);
  52. }
  53. const handlers = nodeList.get(el);
  54. const oldHandlerIndex = handlers.findIndex((item) => item.bindingFn === binding.oldValue);
  55. const newHandler = {
  56. documentHandler: createDocumentHandler(el, binding),
  57. bindingFn: binding.value
  58. };
  59. if (oldHandlerIndex >= 0) {
  60. handlers.splice(oldHandlerIndex, 1, newHandler);
  61. } else {
  62. handlers.push(newHandler);
  63. }
  64. },
  65. unmounted(el) {
  66. nodeList.delete(el);
  67. }
  68. };
  69. export { ClickOutside as default };
  70. //# sourceMappingURL=index.mjs.map