diff --git a/packages/svelte/src/internal/client/dom/elements/events.js b/packages/svelte/src/internal/client/dom/elements/events.js index 1f94162064..651a9d3e05 100644 --- a/packages/svelte/src/internal/client/dom/elements/events.js +++ b/packages/svelte/src/internal/client/dom/elements/events.js @@ -48,7 +48,7 @@ export function create_event(event_name, dom, handler, options) { handle_event_propagation(dom, event); } if (!event.cancelBubble) { - return yield_event_updates(() => handler.call(this, event)); + return yield_event_updates(() => handler.call(this, event), true); } } @@ -204,7 +204,7 @@ export function handle_event_propagation(handler_element, event) { } try { - yield_event_updates(() => next(/** @type {Element} */ (current_target))); + yield_event_updates(() => next(/** @type {Element} */ (current_target)), true); } finally { // @ts-expect-error is used above event.__root = handler_element; diff --git a/packages/svelte/src/internal/client/runtime.js b/packages/svelte/src/internal/client/runtime.js index 16d6df5e90..a624425c54 100644 --- a/packages/svelte/src/internal/client/runtime.js +++ b/packages/svelte/src/internal/client/runtime.js @@ -757,17 +757,17 @@ let prev_event_type; /** * @param {{(): void;(): any;}} fn */ -export function yield_event_updates(fn) { +export function yield_event_updates(fn, flush_between_events = false) { const event = window.event; const previous_scheduler_mode = current_scheduler_mode; // If we're calling yield_updates and there is already an active yield in progress (`is_yield_task_active`) // and it has a different event type, then it's likely that a new event is about to occur that might try and read from the UI. // Additionally, we might be dealing with a case where we explicitly want to flush if `event.isTrusted` is true and - // `is_yield_task_queued`, for example if we had an event like `submit`, that occured because of a `click`. + // `flush_between_events` is enabled, for example if we had an event like `submit`, that occured because of a `click`. if ( previous_scheduler_mode !== FLUSH_YIELD && ((is_yield_task_active && prev_event_type !== event?.type) || - (is_yield_task_queued && event?.isTrusted)) + (is_yield_task_queued && flush_between_events && event?.isTrusted)) ) { flush_sync(); }