Match-id-85ac75c971fa4ec6c390f3d9b8020aab00d82f32

This commit is contained in:
* 2022-02-14 15:47:21 +08:00 committed by *
parent afed2da2e4
commit 1d0db9c844
5 changed files with 15 additions and 34 deletions

View File

@ -19,7 +19,6 @@ const prefix = '_horizon';
const internalKeys = {
VNode: `${prefix}VNode`,
props: `${prefix}Props`,
events: `${prefix}Events`,
nonDelegatedEvents: `${prefix}NonDelegatedEvents`,
};
@ -83,20 +82,11 @@ export function updateVNodeProps(dom: Element | Text, props: Props): void {
dom[internalKeys.props] = props;
}
export function getEventListeners(dom: EventTarget): Set<string> {
let elementListeners = dom[internalKeys.events];
if (!elementListeners) {
elementListeners = new Set();
dom[internalKeys.events] = elementListeners;
}
return elementListeners;
}
export function getNonDelegatedListenerMap(target: EventTarget): Map<string, EventListener> {
let eventsMap = target[internalKeys.nonDelegatedEvents];
export function getNonDelegatedListenerMap(dom: Element | Text): Map<string, EventListener> {
let eventsMap = dom[internalKeys.nonDelegatedEvents];
if (!eventsMap) {
eventsMap = new Map();
target[internalKeys.nonDelegatedEvents] = eventsMap;
dom[internalKeys.nonDelegatedEvents] = eventsMap;
}
return eventsMap;
}

View File

@ -4,7 +4,6 @@
import {allDelegatedNativeEvents} from './EventCollection';
import {isDocument} from '../dom/utils/Common';
import {
getEventListeners,
getNearestVNode,
getNonDelegatedListenerMap,
} from '../dom/DOMInternalKeys';
@ -16,12 +15,6 @@ import {handleEventMain} from './HorizonEventMain';
const listeningMarker = '_horizonListening' + Math.random().toString(36).slice(4);
// 获取节点上已经委托事件名称
function getListenerSetKey(nativeEvtName: string, isCapture: boolean): string {
const sufix = isCapture ? 'capture' : 'bubble';
return `${nativeEvtName}__${sufix}`;
}
// 触发委托事件
function triggerDelegatedEvent(
nativeEvtName: string,
@ -54,20 +47,14 @@ function listenToNativeEvent(
delegatedElement: Element,
isCapture: boolean,
): void {
let target: Element | Document = delegatedElement;
let dom: Element | Document = delegatedElement;
// document层次可能触发selectionchange事件为了捕获这类事件selectionchange事件绑定在document节点上
if (nativeEvtName === 'selectionchange' && !isDocument(delegatedElement)) {
target = delegatedElement.ownerDocument;
dom = delegatedElement.ownerDocument;
}
const listenerSet = getEventListeners(target);
const listenerSetKey = getListenerSetKey(nativeEvtName, isCapture);
if (!listenerSet.has(listenerSetKey)) {
const listener = triggerDelegatedEvent.bind(null, nativeEvtName, isCapture, target);
target.addEventListener(nativeEvtName, listener, isCapture);
listenerSet.add(listenerSetKey);
}
const listener = triggerDelegatedEvent.bind(null, nativeEvtName, isCapture, dom);
dom.addEventListener(nativeEvtName, listener, isCapture);
}
// 监听所有委托事件
@ -101,7 +88,7 @@ function getNativeEvtName(horizonEventName, capture) {
}
// 是否捕获事件
function getIsCapture(horizonEventName) {
function isCaptureEvent(horizonEventName) {
if (horizonEventName === 'onLostPointerCapture' || horizonEventName === 'onGotPointerCapture') {
return false;
}
@ -122,7 +109,7 @@ export function listenNonDelegatedEvent(
domElement: Element,
listener,
): void {
const isCapture = getIsCapture(horizonEventName);
const isCapture = isCaptureEvent(horizonEventName);
const nativeEvtName = getNativeEvtName(horizonEventName, isCapture);
// 先判断是否存在老的监听事件,若存在则移除
@ -130,10 +117,10 @@ export function listenNonDelegatedEvent(
const currentListener = nonDelegatedListenerMap.get(horizonEventName);
if (currentListener) {
domElement.removeEventListener(nativeEvtName, currentListener);
nonDelegatedListenerMap.delete(horizonEventName);
}
if (typeof listener !== 'function') {
nonDelegatedListenerMap.delete(nativeEvtName);
return;
}

View File

@ -8,6 +8,7 @@ export const allDelegatedNativeEvents = new Set();
horizonEventToNativeMap.forEach((dependencies, horizonEvent) => {
allDelegatedHorizonEvents.set(horizonEvent, dependencies);
allDelegatedHorizonEvents.set(horizonEvent + 'Capture', dependencies);
dependencies.forEach(d => {
allDelegatedNativeEvents.add(d);
});

View File

@ -35,6 +35,7 @@ export function getListenersFromTree(
});
}
}
if (eventType === EVENT_TYPE_ALL || eventType === EVENT_TYPE_BUBBLE) {
const bubbleListener = vNode.props[horizonEvtName];
if (bubbleListener) {
@ -49,6 +50,7 @@ export function getListenersFromTree(
}
vNode = vNode.parent;
}
return listeners;
}

View File

@ -7,7 +7,8 @@ import {VNode} from '../../renderer/Types';
// 从原生事件中复制属性到自定义事件中
function extendAttribute(target, source) {
let val;
for (let attr in source) {
let attr;
for (attr in source) {
// 这两个方法需要override
if (attr === 'preventDefault' || attr === 'stopPropagation') {
continue;