diff --git a/.changeset/blur-during-navigation.md b/.changeset/blur-during-navigation.md
new file mode 100644
index 000000000000..aa51e5b2ce79
--- /dev/null
+++ b/.changeset/blur-during-navigation.md
@@ -0,0 +1,5 @@
+---
+'@sveltejs/kit': patch
+---
+
+fix: blur active element before component update during navigation so that blur/focusout handlers fire while old component data is still valid
diff --git a/packages/kit/src/runtime/client/client.js b/packages/kit/src/runtime/client/client.js
index 0faada3d4b01..683960163f62 100644
--- a/packages/kit/src/runtime/client/client.js
+++ b/packages/kit/src/runtime/client/client.js
@@ -1739,6 +1739,16 @@ async function navigate({
navigation_result.props.page.url = url;
}
+ // Remove focus before updating the component tree, so that blur/focusout
+ // handlers fire while the old component's data is still valid (#14575)
+ if (
+ !keepfocus &&
+ document.activeElement instanceof HTMLElement &&
+ document.activeElement !== document.body
+ ) {
+ document.activeElement.blur();
+ }
+
const fork = load_cache_fork && (await load_cache_fork);
if (fork) {
diff --git a/packages/kit/test/apps/basics/src/routes/accessibility/blur-during-navigation/other/+page.svelte b/packages/kit/test/apps/basics/src/routes/accessibility/blur-during-navigation/other/+page.svelte
new file mode 100644
index 000000000000..77976b8a85f6
--- /dev/null
+++ b/packages/kit/test/apps/basics/src/routes/accessibility/blur-during-navigation/other/+page.svelte
@@ -0,0 +1,2 @@
+