Match-id-a2408d45acbea6bdd1daffdd47a08aa3d09bef3a

This commit is contained in:
* 2022-07-25 15:46:42 +08:00 committed by *
commit 7b4512f120
3 changed files with 61 additions and 24 deletions

View File

@ -1,5 +1,6 @@
// 兼容IE的event key // 兼容IE的event key
import { AnyNativeEvent } from './Types';
const uniqueKeyMap = new Map([ const uniqueKeyMap = new Map([
['Esc', 'Escape'], ['Esc', 'Escape'],
['Spacebar', ' '], ['Spacebar', ' '],
@ -10,27 +11,58 @@ const uniqueKeyMap = new Map([
['Del', 'Delete'], ['Del', 'Delete'],
]); ]);
const noop = () => {}; const noop = (): void => {};
// 创建普通自定义事件对象实例,和原生事件对应
export function decorateNativeEvent(customEventName, nativeEvtName, nativeEvent) { // 兼容IE浏览器无法修改Event属性
export class WrappedEvent {
customEventName: string;
nativeEvent: Event;
nativeEventType: string;
type: string;
key: string;
currentTarget: EventTarget | null = null;
stopPropagation: () => void;
preventDefault: () => void;
nativeEvent.isDefaultPrevented = () => nativeEvent.defaultPrevented;
nativeEvent.isPropagationStopped = () => nativeEvent.cancelBubble;
// 适配老版本事件api // 适配老版本事件api
nativeEvent.persist = noop; persist = noop;
constructor(customEventName: string, nativeEvtName: string, nativeEvent: AnyNativeEvent) {
for (const name in nativeEvent) {
this[name] = nativeEvent[name];
}
// stopPropagation和preventDefault 必须通过Event实例调用
this.stopPropagation = () => nativeEvent.stopPropagation();
this.preventDefault = () => nativeEvent.preventDefault();
// custom事件自定义属性 // custom事件自定义属性
nativeEvent.customEventName = customEventName; this.customEventName = customEventName;
nativeEvent.nativeEvent = nativeEvent; this.nativeEvent = nativeEvent;
// 保存原生的事件类型,因为下面会修改 // 保存原生的事件类型,因为下面会修改
nativeEvent.nativeEventType = nativeEvent.type; this.nativeEventType = nativeEvent.type;
Object.defineProperty(nativeEvent, 'type', { writable: true }); this.type = nativeEvtName;
nativeEvent.type = nativeEvtName;
const orgKey = nativeEvent.key; // 兼容IE的event key
Object.defineProperty(nativeEvent, 'key', { writable: true }); const orgKey = (nativeEvent as any).key;
nativeEvent.key = uniqueKeyMap.get(orgKey) || orgKey; this.key = uniqueKeyMap.get(orgKey) || orgKey;
}
return nativeEvent;
isDefaultPrevented(): boolean {
return this.nativeEvent.defaultPrevented;
}
isPropagationStopped(): boolean {
return this.nativeEvent.cancelBubble;
}
}
// 创建普通自定义事件对象实例,和原生事件对应
export function decorateNativeEvent(
customEventName: string,
nativeEvtName: string,
nativeEvent: AnyNativeEvent
): WrappedEvent {
return new WrappedEvent(customEventName, nativeEvtName, nativeEvent);
} }

View File

@ -1,6 +1,7 @@
import { VNode } from '../renderer/Types'; import { VNode } from '../renderer/Types';
import { DomComponent } from '../renderer/vnode/VNodeTags'; import { DomComponent } from '../renderer/vnode/VNodeTags';
import { AnyNativeEvent, ListenerUnitList } from './Types'; import { WrappedEvent } from './EventWrapper';
import { ListenerUnitList } from './Types';
import { EVENT_TYPE_ALL, EVENT_TYPE_BUBBLE, EVENT_TYPE_CAPTURE } from './EventHub'; import { EVENT_TYPE_ALL, EVENT_TYPE_BUBBLE, EVENT_TYPE_CAPTURE } from './EventHub';
// 从vnode属性中获取事件listener // 从vnode属性中获取事件listener
@ -25,7 +26,7 @@ function getListenerFromVNode(vNode: VNode, eventName: string): Function | null
export function getListenersFromTree( export function getListenersFromTree(
targetVNode: VNode | null, targetVNode: VNode | null,
horizonEvtName: string | null, horizonEvtName: string | null,
nativeEvent: AnyNativeEvent, nativeEvent: WrappedEvent,
eventType: string eventType: string
): ListenerUnitList { ): ListenerUnitList {
if (!horizonEvtName) { if (!horizonEvtName) {

View File

@ -1,13 +1,17 @@
import type { VNode } from '../renderer/Types'; import type { VNode } from '../renderer/Types';
import { WrappedEvent } from './EventWrapper';
export type AnyNativeEvent = KeyboardEvent | MouseEvent | TouchEvent | UIEvent | Event; export type AnyNativeEvent = KeyboardEvent | MouseEvent | TouchEvent | UIEvent | Event;
export interface HorizonEventListener {
(event: WrappedEvent): void;
}
export type ListenerUnit = { export type ListenerUnit = {
vNode: null | VNode; vNode: null | VNode;
listener: Function; listener: HorizonEventListener;
currentTarget: EventTarget; currentTarget: EventTarget;
event: AnyNativeEvent; event: WrappedEvent;
}; };
export type ListenerUnitList = Array<ListenerUnit>; export type ListenerUnitList = Array<ListenerUnit>;