xdesign-vue-next
Version:
XDesign Component for vue-next
1 lines • 4.91 kB
Source Map (JSON)
{"version":3,"file":"click-outsider.mjs","sources":["../../../src/color-picker/utils/click-outsider.ts"],"sourcesContent":["import { ComponentPublicInstance, VNode } from 'vue';\nimport { usePrefixClass } from '../../hooks/useConfig';\nimport { isServer, on } from '../../utils/dom';\n\ntype Handler = (...args: unknown[]) => unknown;\n\ninterface ElementHandler {\n elements: HTMLElement[];\n handler: Handler;\n}\n\ntype FlushList = Map<number, ElementHandler>;\n\nconst nodeList: FlushList = new Map();\n\nlet startClick: MouseEvent;\n\nlet uid = 0;\n\nif (!isServer && window.document) {\n on(document, 'mousedown', (e: MouseEvent) => (startClick = e));\n on(document, 'mouseup', (e: MouseEvent) => {\n for (const { handler } of nodeList.values()) {\n handler(e);\n }\n });\n}\n\ntype NodeElement = HTMLElement | VNode | ComponentPublicInstance;\n\nconst createDocumentHandler = (elements: HTMLElement[], handler: Handler, includePopup = true) => {\n const POPUP_SELECTOR = usePrefixClass('popup');\n return (e: MouseEvent) => {\n if (includePopup) {\n document.querySelectorAll(POPUP_SELECTOR.value).forEach((ele: Element) => {\n elements.push(ele as HTMLElement);\n });\n }\n elements = Array.from(new Set(elements));\n const mouseUpTarget = e.target as Node;\n const mouseDownTarget = startClick?.target as Node;\n const isTargetUnExists = !mouseUpTarget || !mouseDownTarget;\n if (isTargetUnExists) {\n return;\n }\n const isContained = elements.some((el) => {\n const isSelf = el === mouseUpTarget;\n const isContainedByEl = el.contains(mouseUpTarget) || el.contains(mouseDownTarget);\n return isSelf || isContainedByEl;\n });\n if (isContained) {\n return;\n }\n handler();\n };\n};\n\n/**\n * 元素外面点击\n *\n * @example\n * onMounted(() => {\n * // 确保元素已挂载\n * addClickOutsider(refs.value, () => {\n * visible.value = false\n * });\n * });\n *\n * onBeforeUnmount(() => removeClickOutsider);\n */\nexport const useClickOutsider = () => {\n uid++;\n const clickOutsiderId = uid;\n const addClickOutsider = (els: NodeElement[], handler: Handler) => {\n const elements = Array.from(new Set(els.filter((el) => el))).map((el: any) => {\n const node = (el.el || el.$el || el) as HTMLElement;\n return node;\n });\n const documentHandler = createDocumentHandler(elements, handler, true);\n nodeList.set(clickOutsiderId, {\n elements,\n handler: documentHandler,\n });\n };\n\n const removeClickOutsider = () => {\n nodeList.has(clickOutsiderId) && nodeList.delete(clickOutsiderId);\n };\n return {\n clickOutsiderId,\n addClickOutsider,\n removeClickOutsider,\n };\n};\n"],"names":["on","_iterator","document","elements","handler","uid","nodeList","clickOutsiderId","addClickOutsider","removeClickOutsider"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAaA,IAAA,QAAA,kBAAA,IAAA,GAAA,EAAA,CAAA;AAEA,IAAA,UAAA,CAAA;AAEA,IAAA,GAAA,GAAA,CAAA,CAAA;AAEA,IAAA,CAAA,QAAA,IAAA,MAAA,CAAA,QAAA,EAAA;AACEA,EAAAA,EAAAA,CAAAA,QAAAA,EAAAA,WAAAA,EAAAA,UAAAA,CAAAA,EAAAA;;;AACGA,EAAAA,EAAAA,CAAAA,QAAAA,EAAAA,SAAAA,EAAAA,UAAAA,CAAAA,EAAAA;;;AAC4C,IAAA,IAAA;;AAAA,QAAA,IAAA,OAAA,GAAA,KAAA,CAAA,KAAA,CAAA,OAAA,CAAA;;AAE7C,OAAA;AAAA,KAAA,CAAA,OAAA,GAAA,EAAA;;AAAA,KAAA,SAAA;AAAAC,MAAAA,SAAAA,CAAAA,CAAAA,EAAAA,CAAAA;AAAA,KAAA;AACF,GAAA,CAAA,CAAA;AACF,CAAA;AAIA,IAAA,qBAAA,GAAA,SAAA,qBAAA,CAAA,QAAA,EAAA,OAAA,EAAA;AAAkG,EAAA,IAAA,YAAA,GAAA,SAAA,CAAA,MAAA,GAAA,CAAA,IAAA,SAAA,CAAA,CAAA,CAAA,KAAA,SAAA,GAAA,SAAA,CAAA,CAAA,CAAA,GAAA,IAAA,CAAA;AAC1F,EAAA,IAAA,cAAA,GAAA,cAAA,CAAA,OAAA,CAAA,CAAA;;AACoB,IAAA,IAAA,WAAA,CAAA;AACxB,IAAA,IAAA,YAAA,EAAA;AACEC,MAAAA,QAAAA,CAAAA,gBAAAA,CAAAA,cAAAA,CAAAA,KAAAA,CAAAA,CAAAA,OAAAA,CAAAA,UAAAA,GAAAA,EAAAA;AACEC,QAAAA,QAAAA,CAAAA,IAAAA,CAAAA,GAAAA,CAAAA,CAAAA;AACF,OAAA,CAAA,CAAA;AACF,KAAA;;AAEA,IAAA,IAAA,aAAA,GAAA,CAAA,CAAA,MAAA,CAAA;;AAEM,IAAA,IAAA,gBAAA,GAAA,CAAA,aAAA,IAAA,CAAA,eAAA,CAAA;AACN,IAAA,IAAA,gBAAA,EAAA;AACE,MAAA,OAAA;AACF,KAAA;;AAEE,MAAA,IAAA,MAAA,GAAA,EAAA,KAAA,aAAA,CAAA;AACA,MAAA,IAAA,eAAA,GAAA,EAAA,CAAA,QAAA,CAAA,aAAA,CAAA,IAAA,EAAA,CAAA,QAAA,CAAA,eAAA,CAAA,CAAA;;AAEF,KAAA,CAAA,CAAA;AACA,IAAA,IAAA,WAAA,EAAA;AACE,MAAA,OAAA;AACF,KAAA;AACQC,IAAAA,OAAAA,EAAAA,CAAAA;;AAEZ,CAAA,CAAA;AAeO,IAAA,gBAAA,GAAA,SAAA,gBAAA,GAAA;AACLC,EAAAA,GAAAA,EAAAA,CAAAA;;;AAGE,IAAA,IAAA,QAAA,GAAA,KAAA,CAAA,IAAA,CAAA,IAAA,GAAA,CAAA,GAAA,CAAA,MAAA,CAAA,UAAA,EAAA,EAAA;AAAgD,MAAA,OAAA,EAAA,CAAA;AAAS,KAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA,UAAA,EAAA,EAAA;;AAEhD,MAAA,OAAA,IAAA,CAAA;AACT,KAAA,CAAA,CAAA;;AAEAC,IAAAA,QAAAA,CAAAA,GAAAA,CAAAA,eAAAA,EAAAA;AACEH,MAAAA,QAAAA,EAAAA,QAAAA;AACAC,MAAAA,OAAAA,EAAAA,eAAAA;AACF,KAAA,CAAA,CAAA;;AAGF,EAAA,IAAA,mBAAA,GAAA,SAAA,mBAAA,GAAA;;;;AAIEG,IAAAA,eAAAA,EAAAA,eAAAA;AACAC,IAAAA,gBAAAA,EAAAA,gBAAAA;AACAC,IAAAA,mBAAAA,EAAAA,mBAAAA;;AAEJ;;;;"}