Match-id-09c8c00ccd1d197334767da9ecced9d8a3cdf25b
This commit is contained in:
commit
9eabd8065c
|
@ -19,7 +19,6 @@ const prefix = '_horizon';
|
||||||
const internalKeys = {
|
const internalKeys = {
|
||||||
VNode: `${prefix}VNode`,
|
VNode: `${prefix}VNode`,
|
||||||
props: `${prefix}Props`,
|
props: `${prefix}Props`,
|
||||||
events: `${prefix}Events`,
|
|
||||||
nonDelegatedEvents: `${prefix}NonDelegatedEvents`,
|
nonDelegatedEvents: `${prefix}NonDelegatedEvents`,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -83,20 +82,11 @@ export function updateVNodeProps(dom: Element | Text, props: Props): void {
|
||||||
dom[internalKeys.props] = props;
|
dom[internalKeys.props] = props;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getEventListeners(dom: EventTarget): Set<string> {
|
export function getNonDelegatedListenerMap(dom: Element | Text): Map<string, EventListener> {
|
||||||
let elementListeners = dom[internalKeys.events];
|
let eventsMap = dom[internalKeys.nonDelegatedEvents];
|
||||||
if (!elementListeners) {
|
|
||||||
elementListeners = new Set();
|
|
||||||
dom[internalKeys.events] = elementListeners;
|
|
||||||
}
|
|
||||||
return elementListeners;
|
|
||||||
}
|
|
||||||
|
|
||||||
export function getNonDelegatedListenerMap(target: EventTarget): Map<string, EventListener> {
|
|
||||||
let eventsMap = target[internalKeys.nonDelegatedEvents];
|
|
||||||
if (!eventsMap) {
|
if (!eventsMap) {
|
||||||
eventsMap = new Map();
|
eventsMap = new Map();
|
||||||
target[internalKeys.nonDelegatedEvents] = eventsMap;
|
dom[internalKeys.nonDelegatedEvents] = eventsMap;
|
||||||
}
|
}
|
||||||
return eventsMap;
|
return eventsMap;
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,7 +4,6 @@
|
||||||
import {allDelegatedNativeEvents} from './EventCollection';
|
import {allDelegatedNativeEvents} from './EventCollection';
|
||||||
import {isDocument} from '../dom/utils/Common';
|
import {isDocument} from '../dom/utils/Common';
|
||||||
import {
|
import {
|
||||||
getEventListeners,
|
|
||||||
getNearestVNode,
|
getNearestVNode,
|
||||||
getNonDelegatedListenerMap,
|
getNonDelegatedListenerMap,
|
||||||
} from '../dom/DOMInternalKeys';
|
} from '../dom/DOMInternalKeys';
|
||||||
|
@ -16,12 +15,6 @@ import {handleEventMain} from './HorizonEventMain';
|
||||||
|
|
||||||
const listeningMarker = '_horizonListening' + Math.random().toString(36).slice(4);
|
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(
|
function triggerDelegatedEvent(
|
||||||
nativeEvtName: string,
|
nativeEvtName: string,
|
||||||
|
@ -54,20 +47,14 @@ function listenToNativeEvent(
|
||||||
delegatedElement: Element,
|
delegatedElement: Element,
|
||||||
isCapture: boolean,
|
isCapture: boolean,
|
||||||
): void {
|
): void {
|
||||||
let target: Element | Document = delegatedElement;
|
let dom: Element | Document = delegatedElement;
|
||||||
// document层次可能触发selectionchange事件,为了捕获这类事件,selectionchange事件绑定在document节点上
|
// document层次可能触发selectionchange事件,为了捕获这类事件,selectionchange事件绑定在document节点上
|
||||||
if (nativeEvtName === 'selectionchange' && !isDocument(delegatedElement)) {
|
if (nativeEvtName === 'selectionchange' && !isDocument(delegatedElement)) {
|
||||||
target = delegatedElement.ownerDocument;
|
dom = delegatedElement.ownerDocument;
|
||||||
}
|
}
|
||||||
|
|
||||||
const listenerSet = getEventListeners(target);
|
const listener = triggerDelegatedEvent.bind(null, nativeEvtName, isCapture, dom);
|
||||||
const listenerSetKey = getListenerSetKey(nativeEvtName, isCapture);
|
dom.addEventListener(nativeEvtName, listener, isCapture);
|
||||||
|
|
||||||
if (!listenerSet.has(listenerSetKey)) {
|
|
||||||
const listener = triggerDelegatedEvent.bind(null, nativeEvtName, isCapture, target);
|
|
||||||
target.addEventListener(nativeEvtName, listener, isCapture);
|
|
||||||
listenerSet.add(listenerSetKey);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 监听所有委托事件
|
// 监听所有委托事件
|
||||||
|
@ -101,7 +88,7 @@ function getNativeEvtName(horizonEventName, capture) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// 是否捕获事件
|
// 是否捕获事件
|
||||||
function getIsCapture(horizonEventName) {
|
function isCaptureEvent(horizonEventName) {
|
||||||
if (horizonEventName === 'onLostPointerCapture' || horizonEventName === 'onGotPointerCapture') {
|
if (horizonEventName === 'onLostPointerCapture' || horizonEventName === 'onGotPointerCapture') {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -122,7 +109,7 @@ export function listenNonDelegatedEvent(
|
||||||
domElement: Element,
|
domElement: Element,
|
||||||
listener,
|
listener,
|
||||||
): void {
|
): void {
|
||||||
const isCapture = getIsCapture(horizonEventName);
|
const isCapture = isCaptureEvent(horizonEventName);
|
||||||
const nativeEvtName = getNativeEvtName(horizonEventName, isCapture);
|
const nativeEvtName = getNativeEvtName(horizonEventName, isCapture);
|
||||||
|
|
||||||
// 先判断是否存在老的监听事件,若存在则移除
|
// 先判断是否存在老的监听事件,若存在则移除
|
||||||
|
@ -130,10 +117,10 @@ export function listenNonDelegatedEvent(
|
||||||
const currentListener = nonDelegatedListenerMap.get(horizonEventName);
|
const currentListener = nonDelegatedListenerMap.get(horizonEventName);
|
||||||
if (currentListener) {
|
if (currentListener) {
|
||||||
domElement.removeEventListener(nativeEvtName, currentListener);
|
domElement.removeEventListener(nativeEvtName, currentListener);
|
||||||
|
nonDelegatedListenerMap.delete(horizonEventName);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (typeof listener !== 'function') {
|
if (typeof listener !== 'function') {
|
||||||
nonDelegatedListenerMap.delete(nativeEvtName);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -8,6 +8,7 @@ export const allDelegatedNativeEvents = new Set();
|
||||||
horizonEventToNativeMap.forEach((dependencies, horizonEvent) => {
|
horizonEventToNativeMap.forEach((dependencies, horizonEvent) => {
|
||||||
allDelegatedHorizonEvents.set(horizonEvent, dependencies);
|
allDelegatedHorizonEvents.set(horizonEvent, dependencies);
|
||||||
allDelegatedHorizonEvents.set(horizonEvent + 'Capture', dependencies);
|
allDelegatedHorizonEvents.set(horizonEvent + 'Capture', dependencies);
|
||||||
|
|
||||||
dependencies.forEach(d => {
|
dependencies.forEach(d => {
|
||||||
allDelegatedNativeEvents.add(d);
|
allDelegatedNativeEvents.add(d);
|
||||||
});
|
});
|
||||||
|
|
|
@ -35,6 +35,7 @@ export function getListenersFromTree(
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (eventType === EVENT_TYPE_ALL || eventType === EVENT_TYPE_BUBBLE) {
|
if (eventType === EVENT_TYPE_ALL || eventType === EVENT_TYPE_BUBBLE) {
|
||||||
const bubbleListener = vNode.props[horizonEvtName];
|
const bubbleListener = vNode.props[horizonEvtName];
|
||||||
if (bubbleListener) {
|
if (bubbleListener) {
|
||||||
|
@ -49,6 +50,7 @@ export function getListenersFromTree(
|
||||||
}
|
}
|
||||||
vNode = vNode.parent;
|
vNode = vNode.parent;
|
||||||
}
|
}
|
||||||
|
|
||||||
return listeners;
|
return listeners;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,8 @@ import {VNode} from '../../renderer/Types';
|
||||||
// 从原生事件中复制属性到自定义事件中
|
// 从原生事件中复制属性到自定义事件中
|
||||||
function extendAttribute(target, source) {
|
function extendAttribute(target, source) {
|
||||||
let val;
|
let val;
|
||||||
for (let attr in source) {
|
let attr;
|
||||||
|
for (attr in source) {
|
||||||
// 这两个方法需要override
|
// 这两个方法需要override
|
||||||
if (attr === 'preventDefault' || attr === 'stopPropagation') {
|
if (attr === 'preventDefault' || attr === 'stopPropagation') {
|
||||||
continue;
|
continue;
|
||||||
|
|
Loading…
Reference in New Issue