Match-id-a2408d45acbea6bdd1daffdd47a08aa3d09bef3a
This commit is contained in:
commit
7b4512f120
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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>;
|
||||||
|
|
Loading…
Reference in New Issue