tdesign-vue-next
Version:
TDesign Component for vue-next
1 lines • 6.22 kB
Source Map (JSON)
{"version":3,"file":"click-outsider.mjs","sources":["../../../../components/color-picker/utils/click-outsider.ts"],"sourcesContent":["import { ComponentPublicInstance, VNode } from 'vue';\nimport { usePrefixClass } from '@tdesign/shared-hooks';\nimport { isServer, on } from '@tdesign/shared-utils';\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":["nodeList","Map","startClick","uid","isServer","window","document","on","e","_iterator","_createForOfIteratorHelper","values","_step","s","n","done","handler","value","err","f","createDocumentHandler","elements","includePopup","POPUP_SELECTOR","usePrefixClass","_startClick","querySelectorAll","forEach","ele","push","Array","from","Set","mouseUpTarget","target","mouseDownTarget","isTargetUnExists","isContained","some","el","isSelf","isContainedByEl","contains","useClickOutsider","clickOutsiderId","addClickOutsider","els","filter","map","node","$el","documentHandler","set","removeClickOutsider","has"],"mappings":"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"}