|
@@ -3,12 +3,8 @@ import {
|
|
|
onEffectCleanup,
|
|
onEffectCleanup,
|
|
|
onScopeDispose,
|
|
onScopeDispose,
|
|
|
} from '@vue/reactivity'
|
|
} from '@vue/reactivity'
|
|
|
-import {
|
|
|
|
|
- MetadataKind,
|
|
|
|
|
- getMetadata,
|
|
|
|
|
- recordEventMetadata,
|
|
|
|
|
-} from '../componentMetadata'
|
|
|
|
|
import { queuePostFlushCb } from '@vue/runtime-dom'
|
|
import { queuePostFlushCb } from '@vue/runtime-dom'
|
|
|
|
|
+import { remove } from '@vue/shared'
|
|
|
|
|
|
|
|
export function addEventListener(
|
|
export function addEventListener(
|
|
|
el: Element,
|
|
el: Element,
|
|
@@ -49,13 +45,17 @@ export type DelegatedHandler = {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
export function delegate(
|
|
export function delegate(
|
|
|
- el: HTMLElement,
|
|
|
|
|
|
|
+ el: any,
|
|
|
event: string,
|
|
event: string,
|
|
|
handlerGetter: () => undefined | ((...args: any[]) => any),
|
|
handlerGetter: () => undefined | ((...args: any[]) => any),
|
|
|
): void {
|
|
): void {
|
|
|
const handler: DelegatedHandler = eventHandler(handlerGetter)
|
|
const handler: DelegatedHandler = eventHandler(handlerGetter)
|
|
|
handler.delegate = true
|
|
handler.delegate = true
|
|
|
- recordEventMetadata(el, event, handler)
|
|
|
|
|
|
|
+
|
|
|
|
|
+ const cacheKey = `$evt${event}`
|
|
|
|
|
+ const handlers: DelegatedHandler[] = el[cacheKey] || (el[cacheKey] = [])
|
|
|
|
|
+ handlers.push(handler)
|
|
|
|
|
+ onScopeDispose(() => remove(handlers, handler))
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
function eventHandler(getter: () => undefined | ((...args: any[]) => any)) {
|
|
function eventHandler(getter: () => undefined | ((...args: any[]) => any)) {
|
|
@@ -98,7 +98,7 @@ const delegatedEventHandler = (e: Event) => {
|
|
|
},
|
|
},
|
|
|
})
|
|
})
|
|
|
while (node !== null) {
|
|
while (node !== null) {
|
|
|
- const handlers = getMetadata(node)[MetadataKind.event][e.type]
|
|
|
|
|
|
|
+ const handlers = node[`$evt${e.type}`] as DelegatedHandler[]
|
|
|
if (handlers) {
|
|
if (handlers) {
|
|
|
for (const handler of handlers) {
|
|
for (const handler of handlers) {
|
|
|
if (handler.delegate && !node.disabled) {
|
|
if (handler.delegate && !node.disabled) {
|