diff --git a/.changeset/chatty-mice-tan.md b/.changeset/chatty-mice-tan.md
new file mode 100644
index 000000000000..49e6b85ceb0c
--- /dev/null
+++ b/.changeset/chatty-mice-tan.md
@@ -0,0 +1,5 @@
+---
+'@sveltejs/kit': minor
+---
+
+Checks that element is not null before reading getAttribute
diff --git a/packages/kit/src/runtime/client/utils.js b/packages/kit/src/runtime/client/utils.js
index 8cdd0146f128..7f953d1f4dbd 100644
--- a/packages/kit/src/runtime/client/utils.js
+++ b/packages/kit/src/runtime/client/utils.js
@@ -153,7 +153,7 @@ export function get_router_options(element) {
/** @type {Element} */
let el = element;
- while (el !== document.documentElement) {
+ while (el && el !== document.documentElement) {
if (preload_code === null) preload_code = link_option(el, 'preload-code');
if (preload_data === null) preload_data = link_option(el, 'preload-data');
if (noscroll === null) noscroll = link_option(el, 'noscroll');
diff --git a/packages/kit/test/apps/basics/src/routes/interactivity/toggle-element/+page.svelte b/packages/kit/test/apps/basics/src/routes/interactivity/toggle-element/+page.svelte
index 449acb98612c..cc0dcf6b0606 100644
--- a/packages/kit/test/apps/basics/src/routes/interactivity/toggle-element/+page.svelte
+++ b/packages/kit/test/apps/basics/src/routes/interactivity/toggle-element/+page.svelte
@@ -8,6 +8,8 @@
{#if visible}
+ remove
{:else}
+ add
{/if}
diff --git a/packages/kit/test/apps/basics/test/client.test.js b/packages/kit/test/apps/basics/test/client.test.js
index ed5270f285dc..b81213171568 100644
--- a/packages/kit/test/apps/basics/test/client.test.js
+++ b/packages/kit/test/apps/basics/test/client.test.js
@@ -1200,6 +1200,10 @@ test.describe('Interactivity', () => {
await page.click('button');
expect(await page.textContent('button')).toBe('add');
+ expect(await page.textContent('a')).toBe('add');
+
+ await page.click('a');
+ expect(await page.textContent('a')).toBe('remove');
expect(errored).toBe(false);
});