tdesign-mobile-vue
Version:
tdesign-mobile-vue
1 lines • 6.16 kB
Source Map (JSON)
{"version":3,"file":"index.mjs","sources":["../../../src/shared/useClickAway/index.ts"],"sourcesContent":["import { MaybeElementRef, UnRefElementReturn, unrefElement, useEventListener } from '@vueuse/core';\nimport { isArray } from 'lodash-es';\nimport { isBrowser } from '../util';\n\nexport interface UseClickAwayOptions {\n /**\n * The name of the trigger event.\n * @default 'touchstart'\n */\n eventName?: string;\n /**\n * Use capturing phase for internal event listener.\n * @default true\n */\n capture?: boolean;\n /**\n * List of elements that should not trigger the event.\n */\n ignore?: Array<MaybeElementRef>;\n /**\n * Run handler function if focus moves to an iframe.\n * @default false\n */\n detectIframe?: boolean;\n}\n\nexport type UseClickAwayHandler<\n T extends { detectIframe: UseClickAwayOptions['detectIframe'] } = { detectIframe: false },\n> = (evt: T['detectIframe'] extends true ? PointerEvent | FocusEvent : PointerEvent) => void;\n\n/**\n * Listen for clicks outside of a collection of elements.\n * @param target\n * @param fn\n * @param options\n */\nexport function useClickAway<T extends UseClickAwayOptions>(\n target: MaybeElementRef | Array<MaybeElementRef>,\n fn: UseClickAwayHandler<{ detectIframe: T['detectIframe'] }>,\n options: T = {} as T,\n) {\n if (!isBrowser) return;\n\n const { eventName = 'touchstart', capture = true, ignore = [], detectIframe = false } = options;\n\n const listenerOptions = {\n passive: true,\n capture,\n };\n\n // el是否包含在event.target\n const checkElInEvtTarget = (el: UnRefElementReturn, event: PointerEvent) => {\n return el && (event.target === el || event.composedPath().includes(el));\n };\n\n const shouldIgnore = (event: PointerEvent) => {\n return ignore.some((ignoreTarget) => checkElInEvtTarget(unrefElement(ignoreTarget), event));\n };\n\n const eventHandler = (event: PointerEvent) => {\n const targets = isArray(target) ? [...target] : [target];\n\n let shouldTrigger = targets.every((targetItem) => !checkElInEvtTarget(unrefElement(targetItem), event));\n\n if (!shouldTrigger) return;\n\n shouldTrigger = !shouldIgnore(event);\n\n if (!shouldTrigger) return;\n\n fn(event);\n };\n\n const cleanup = [useEventListener(window, eventName, eventHandler, listenerOptions)];\n\n if (detectIframe) {\n cleanup.push(\n useEventListener(window, 'blur', (event: PointerEvent) => {\n setTimeout(() => {\n const targets = isArray(target) ? [...target] : [target];\n\n if (\n targets.every((targetItem) => {\n const el = unrefElement(targetItem);\n return (\n window.document.activeElement?.tagName === 'IFRAME' && !el?.contains(window.document.activeElement)\n );\n })\n ) {\n fn(event);\n }\n }, 0);\n }),\n );\n }\n\n return () => cleanup.forEach((clean) => clean());\n}\n"],"names":["useClickAway","target","fn","options","arguments","length","undefined","isBrowser","_options$eventName","eventName","_options$capture","capture","_options$ignore","ignore","_options$detectIframe","detectIframe","listenerOptions","passive","checkElInEvtTarget","el","event","composedPath","includes","shouldIgnore","some","ignoreTarget","unrefElement","eventHandler","targets","isArray","_toConsumableArray","shouldTrigger","every","targetItem","cleanup","useEventListener","window","push","setTimeout","_window$document$acti","document","activeElement","tagName","contains","forEach","clean"],"mappings":"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"}