ivue-material-plus
Version:
A high quality UI components Library with Vue.js
1 lines • 8.64 kB
Source Map (JSON)
{"version":3,"file":"click-outside.mjs","sources":["../../../../../src/utils/directives/click-outside.ts"],"sourcesContent":["const CLICK = 'click';\r\n// 捕获实例\r\nconst captureInstances = Object.create(null);\r\n// 不捕获实例\r\nconst nonCaptureInstances = Object.create(null);\r\n// 实例列表\r\nconst instancesList = [captureInstances, nonCaptureInstances];\r\n\r\n/**\r\n * The common event handler for bot capture and non-capture events.\r\n *\r\n * @param {!Object} context - The event context.\r\n * @param {!Object} instances - The capture or non-capture registered instances.\r\n * @param {Event} event - The event object.\r\n * @returns {undefined} Default.\r\n */\r\n\r\nconst commonHandler = function _onCommonHandler(context, instances, event) {\r\n const { target } = event;\r\n\r\n const item = function _item(item) {\r\n const { el } = item;\r\n\r\n if (el !== target && !el.contains(target)) {\r\n const { binding } = item;\r\n\r\n if (binding.modifiers.stop) {\r\n event.stopPropagation();\r\n }\r\n\r\n if (binding.modifiers.prevent) {\r\n event.preventDefault();\r\n }\r\n\r\n binding.value.call(context, event);\r\n }\r\n };\r\n\r\n const key = function _key(eventName: string) {\r\n return instances[eventName].forEach(item);\r\n };\r\n\r\n Object.keys(instances).forEach(key);\r\n};\r\n\r\n// 捕获事件处理程序\r\nconst captureEventHandler = function onCaptureEvent(event) {\r\n commonHandler(this, captureInstances, event);\r\n};\r\n\r\n// 非捕获事件处理程序\r\nconst nonCaptureEventHandler = function onNonCaptureEvent(event) {\r\n commonHandler(this, nonCaptureInstances, event);\r\n};\r\n\r\n// 获取事件处理程序\r\nconst getEventHandler = function _getEventHandler(useCapture: boolean) {\r\n return useCapture ? captureEventHandler : nonCaptureEventHandler;\r\n};\r\n\r\n// 指令定义\r\nfunction inserted(el: Element, binding: Record<string, any>): void {\r\n // 判断参数\r\n if (typeof binding.value !== 'function') {\r\n throw new TypeError('Binding value must be a function');\r\n }\r\n\r\n // 事件名称\r\n let eventType;\r\n const modifiers = binding.modifiers;\r\n\r\n if (modifiers.click) {\r\n eventType = 'click';\r\n } else if (modifiers.mousedown) {\r\n eventType = 'mousedown';\r\n } else if (modifiers.touchstart) {\r\n eventType = 'touchstart';\r\n } else {\r\n eventType = CLICK;\r\n }\r\n\r\n // 是否开启外部点击的 capture 模式,可通过全局配置\r\n const useCapture = binding.arg;\r\n\r\n // 归并事件绑定\r\n const normalisedBinding = {\r\n ...binding,\r\n ...{\r\n // 一个包含修饰符的对象。例如:v-my-directive.foo.bar 中,修饰符对象为 { foo: true, bar: true }\r\n modifiers: {\r\n ...{\r\n // 添加事件侦听器时使用 capture 模式\r\n capture: false,\r\n // 阻止默认行为\r\n prevent: false,\r\n // 调用 event.stopPropagation() 停止冒泡\r\n stop: false,\r\n },\r\n ...binding.modifiers,\r\n },\r\n },\r\n };\r\n\r\n // 实例化事件\r\n const instances = useCapture ? captureInstances : nonCaptureInstances;\r\n\r\n // 判断事件中是否有对应的指令参数 初始化指令\r\n if (!Array.isArray(instances[eventType])) {\r\n instances[eventType] = [];\r\n }\r\n\r\n if (\r\n instances[eventType].push({\r\n el,\r\n binding: normalisedBinding,\r\n }) === 1\r\n ) {\r\n if (typeof document === 'object' && document) {\r\n document.addEventListener(\r\n eventType,\r\n getEventHandler(useCapture),\r\n useCapture\r\n );\r\n }\r\n }\r\n}\r\n\r\n// 指令与元素解绑时调用\r\nfunction unbind(el: Element): void {\r\n // 比较元素\r\n const compareElements = function _compareElements(item) {\r\n return item.el !== el;\r\n };\r\n\r\n const instances = function _instances(instances) {\r\n // 实例key\r\n const instancesKeys = Object.keys(instances);\r\n\r\n // 判断是否有实例\r\n if (instancesKeys.length) {\r\n // 判断是否使用事件捕获\r\n const useCapture = instances === captureInstances;\r\n\r\n const keys = function _keys(eventName: string) {\r\n // 查找元素实例\r\n const newInstance = instances[eventName].filter(compareElements);\r\n\r\n if (newInstance.length) {\r\n instances[eventName] = newInstance;\r\n } else {\r\n if (typeof document === 'object' && document) {\r\n // 移除事件\r\n document.removeEventListener(\r\n eventName,\r\n getEventHandler(useCapture),\r\n useCapture\r\n );\r\n }\r\n\r\n delete instances[eventName];\r\n }\r\n };\r\n\r\n instancesKeys.forEach(keys);\r\n }\r\n };\r\n\r\n instancesList.forEach(instances);\r\n}\r\n\r\nexport default {\r\n beforeMount: inserted,\r\n unmounted: unbind,\r\n};\r\n"],"names":["item","instances"],"mappings":"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"}