From ed6d7eeb483581a0a17424d71dd9487c08103351 Mon Sep 17 00:00:00 2001 From: Dominic Gannaway Date: Sun, 20 Oct 2024 13:06:30 +0100 Subject: [PATCH] wrap-transition-events (#13719) --- .changeset/famous-insects-sort.md | 5 +++++ .../client/dom/elements/transitions.js | 19 +++++++++++++++++-- 2 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 .changeset/famous-insects-sort.md diff --git a/.changeset/famous-insects-sort.md b/.changeset/famous-insects-sort.md new file mode 100644 index 0000000000..d38361b99d --- /dev/null +++ b/.changeset/famous-insects-sort.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +chore: ensure transition events are dispatched without current reaction diff --git a/packages/svelte/src/internal/client/dom/elements/transitions.js b/packages/svelte/src/internal/client/dom/elements/transitions.js index b473d0029d..158cee84c0 100644 --- a/packages/svelte/src/internal/client/dom/elements/transitions.js +++ b/packages/svelte/src/internal/client/dom/elements/transitions.js @@ -1,7 +1,13 @@ /** @import { AnimateFn, Animation, AnimationConfig, EachItem, Effect, TransitionFn, TransitionManager } from '#client' */ import { noop, is_function } from '../../../shared/utils.js'; import { effect } from '../../reactivity/effects.js'; -import { active_effect, untrack } from '../../runtime.js'; +import { + active_effect, + active_reaction, + set_active_effect, + set_active_reaction, + untrack +} from '../../runtime.js'; import { loop } from '../../loop.js'; import { should_intro } from '../../render.js'; import { current_each_item } from '../blocks/each.js'; @@ -15,7 +21,16 @@ import { queue_micro_task } from '../task.js'; * @returns {void} */ function dispatch_event(element, type) { - element.dispatchEvent(new CustomEvent(type)); + var previous_reaction = active_reaction; + var previous_effect = active_effect; + set_active_reaction(null); + set_active_effect(null); + try { + element.dispatchEvent(new CustomEvent(type)); + } finally { + set_active_reaction(previous_reaction); + set_active_effect(previous_effect); + } } /**