diff --git a/.changeset/event-walk-composed-path.md b/.changeset/event-walk-composed-path.md new file mode 100644 index 0000000000..8b24573930 --- /dev/null +++ b/.changeset/event-walk-composed-path.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +perf: walk composedPath() directly in delegated event propagation diff --git a/packages/svelte/src/internal/client/dom/elements/events.js b/packages/svelte/src/internal/client/dom/elements/events.js index 5aa41e1c4d..45e042a8c6 100644 --- a/packages/svelte/src/internal/client/dom/elements/events.js +++ b/packages/svelte/src/internal/client/dom/elements/events.js @@ -257,12 +257,7 @@ export function handle_event_propagation(event) { var other_errors = []; while (current_target !== null) { - /** @type {null | Element} */ - var parent_element = - current_target.assignedSlot || - current_target.parentNode || - /** @type {any} */ (current_target).host || - null; + if (current_target === handler_element) break; try { // @ts-expect-error @@ -284,10 +279,10 @@ export function handle_event_propagation(event) { throw_error = error; } } - if (event.cancelBubble || parent_element === handler_element || parent_element === null) { - break; - } - current_target = parent_element; + if (event.cancelBubble) break; + + path_idx++; + current_target = path_idx < path.length ? /** @type {Element} */ (path[path_idx]) : null; } if (throw_error) {