注册事件的回调
packages/react-dom-bindings/src/events/DOMPluginEventSystem.js
js
/**
* 处理分发队列
* @param {Array} dispatchQueue 分发队列
* @param {number} eventSystemFlags 事件系统标记
*/
function processDispatchQueue(dispatchQueue, eventSystemFlags) {
// 判断是否在捕获阶段
const isCapturePhase = (eventSystemFlags & IS_CAPTURE_PHASE) !== 0;
for (let i = 0; i < dispatchQueue.length; i++) {
const { event, listeners } = dispatchQueue[i];
// 按顺序处理分发队列中的项目
processDispatchQueueItemsInOrder(event, listeners, isCapturePhase);
}
}
/**
* 执行分发
* @param {Event} event 事件
* @param {Function} listener 监听器函数
* @param {Element} currentTarget 当前目标元素
*/
function executeDispatch(event, listener, currentTarget) {
event.currentTarget = currentTarget;
listener(event);
}
/**
* 按顺序处理分发队列中的项目
* @param {Event} event 事件
* @param {Array} dispatchListeners 分发监听器列表
* @param {boolean} isCapturePhase 是否在捕获阶段
*/
function processDispatchQueueItemsInOrder(event, dispatchListeners, isCapturePhase) {
if (isCapturePhase) {
for (let i = dispatchListeners.length - 1; i >= 0; i--) {
const { listener, currentTarget } = dispatchListeners[i];
if (event.isPropagationStopped()) {
return;
}
executeDispatch(event, listener, currentTarget);
}
} else {
for (let i = 0; i < dispatchListeners.length; i++) {
const { listener, currentTarget } = dispatchListeners[i];
if (event.isPropagationStopped()) {
return;
}
executeDispatch(event, listener, currentTarget);
}
}
}