From d6e70b661b4ef56ab545679c19c197b61710e191 Mon Sep 17 00:00:00 2001 From: benjosua Date: Tue, 20 Jan 2026 15:57:35 +0100 Subject: [PATCH] fix: handle event delegation in custom elements (#17057) Fixes issue where handle_event_propagation breaks when delegated events are arrays instead of functions, which can happen in custom elements used across different Svelte versions. Changes: 1. Compiler: Don't delegate events in custom element builds 2. Runtime: Handle both function and array delegates defensively This prevents cross-version compatibility issues with custom elements. --- .../src/compiler/phases/2-analyze/visitors/Attribute.js | 4 +++- .../svelte/src/internal/client/dom/elements/events.js | 8 +++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/packages/svelte/src/compiler/phases/2-analyze/visitors/Attribute.js b/packages/svelte/src/compiler/phases/2-analyze/visitors/Attribute.js index 2b7d636606..2dd34bc2db 100644 --- a/packages/svelte/src/compiler/phases/2-analyze/visitors/Attribute.js +++ b/packages/svelte/src/compiler/phases/2-analyze/visitors/Attribute.js @@ -60,7 +60,9 @@ export function Attribute(node, context) { } node.metadata.delegated = - parent?.type === 'RegularElement' && can_delegate_event(node.name.slice(2)); + parent?.type === 'RegularElement' && + can_delegate_event(node.name.slice(2)) && + !context.state.analysis.custom_element; } } } diff --git a/packages/svelte/src/internal/client/dom/elements/events.js b/packages/svelte/src/internal/client/dom/elements/events.js index 4c64c8364a..32a1809583 100644 --- a/packages/svelte/src/internal/client/dom/elements/events.js +++ b/packages/svelte/src/internal/client/dom/elements/events.js @@ -258,7 +258,13 @@ export function handle_event_propagation(event) { // -> the target could not have been disabled because it emits the event in the first place event.target === current_target) ) { - delegated.call(current_target, event); + if (Array.isArray(delegated)) { + for (const handler of delegated) { + handler.call(current_target, event); + } + } else if (typeof delegated === "function") { + delegated.call(current_target, event); + } } } catch (error) { if (throw_error) {