From 9091e7e930a80695ba951bfdb8170791322651fe Mon Sep 17 00:00:00 2001 From: Simon H <5968653+dummdidumm@users.noreply.github.com> Date: Mon, 17 Feb 2025 22:16:09 +0100 Subject: [PATCH] fix: fire delegated events on target even it was disabled in the meantime (#15319) They DOM could've been updated already by the time the event bubbling logic is reached, so the target element itself could not be notified of the event because it is marked as disabled. But the target could not have been disabled because it emits the event in the first place, so we emit regardless. No test because not reproducible in jsdom environment. Fixes #15256 --- .changeset/wicked-apples-yawn.md | 5 +++++ .../svelte/src/internal/client/dom/elements/events.js | 8 +++++++- 2 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 .changeset/wicked-apples-yawn.md diff --git a/.changeset/wicked-apples-yawn.md b/.changeset/wicked-apples-yawn.md new file mode 100644 index 0000000000..3022c34fd0 --- /dev/null +++ b/.changeset/wicked-apples-yawn.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: fire delegated events on target even it was disabled in the meantime diff --git a/packages/svelte/src/internal/client/dom/elements/events.js b/packages/svelte/src/internal/client/dom/elements/events.js index 363b8e1ed5..25ece5f569 100644 --- a/packages/svelte/src/internal/client/dom/elements/events.js +++ b/packages/svelte/src/internal/client/dom/elements/events.js @@ -237,7 +237,13 @@ export function handle_event_propagation(event) { // @ts-expect-error var delegated = current_target['__' + event_name]; - if (delegated !== undefined && !(/** @type {any} */ (current_target).disabled)) { + if ( + delegated !== undefined && + (!(/** @type {any} */ (current_target).disabled) || + // DOM could've been updated already by the time this is reached, so we check this as well + // -> the target could not have been disabled because it emits the event in the first place + event.target === current_target) + ) { if (is_array(delegated)) { var [fn, ...data] = delegated; fn.apply(current_target, [event, ...data]);