From e7e2dedf5d17bfd324662cd8b230e6be7ef1668f Mon Sep 17 00:00:00 2001 From: Steve Sanderson Date: Thu, 26 Sep 2019 13:40:17 +0100 Subject: [PATCH] Implement actual "stop bubbling" --- .../Web.JS/src/Rendering/EventDelegator.ts | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/Components/Web.JS/src/Rendering/EventDelegator.ts b/src/Components/Web.JS/src/Rendering/EventDelegator.ts index 3c00ed426e..d5f03f1ae6 100644 --- a/src/Components/Web.JS/src/Rendering/EventDelegator.ts +++ b/src/Components/Web.JS/src/Rendering/EventDelegator.ts @@ -92,6 +92,7 @@ export class EventDelegator { let candidateElement = evt.target as Element | null; let eventArgs: EventForDotNet | null = null; // Populate lazily const eventIsNonBubbling = nonBubblingEvents.hasOwnProperty(evt.type); + let stopBubblingWasRequested = false; while (candidateElement) { const handlerInfos = this.getEventHandlerInfosForElement(candidateElement, false); if (handlerInfos) { @@ -105,9 +106,13 @@ export class EventDelegator { const eventFieldInfo = EventFieldInfo.fromEvent(handlerInfo.renderingComponentId, evt); this.onEvent(evt, handlerInfo.eventHandlerId, eventArgs, eventFieldInfo); } + + if (handlerInfos.stopBubbling(evt.type)) { + stopBubblingWasRequested = true; + } } - candidateElement = eventIsNonBubbling ? null : candidateElement.parentElement; + candidateElement = (eventIsNonBubbling || stopBubblingWasRequested) ? null : candidateElement.parentElement; } } @@ -205,8 +210,8 @@ class EventHandlerInfosForElement { delete this.handlers[eventName]; } - public preventDefault(eventName: string, setValue: boolean | null): boolean { - if (setValue !== null) { + public preventDefault(eventName: string, setValue?: boolean): boolean { + if (setValue !== undefined) { this.preventDefaultFlags = this.preventDefaultFlags || {}; this.preventDefaultFlags[eventName] = setValue; } @@ -214,8 +219,8 @@ class EventHandlerInfosForElement { return this.preventDefaultFlags ? this.preventDefaultFlags[eventName] : false; } - public stopBubbling(eventName: string, setValue: boolean | null): boolean { - if (setValue !== null) { + public stopBubbling(eventName: string, setValue?: boolean): boolean { + if (setValue !== undefined) { this.stopBubblingFlags = this.stopBubblingFlags || {}; this.stopBubblingFlags[eventName] = setValue; }