diff --git a/.changeset/clean-head-anchors.md b/.changeset/clean-head-anchors.md new file mode 100644 index 0000000000..d58283f502 --- /dev/null +++ b/.changeset/clean-head-anchors.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: remove `` anchors on unmount diff --git a/packages/svelte/src/internal/client/dom/blocks/svelte-head.js b/packages/svelte/src/internal/client/dom/blocks/svelte-head.js index 5721f7b056..d22d74b275 100644 --- a/packages/svelte/src/internal/client/dom/blocks/svelte-head.js +++ b/packages/svelte/src/internal/client/dom/blocks/svelte-head.js @@ -52,6 +52,14 @@ export function head(hash, render_fn) { block(() => { var e = branch(() => render_fn(anchor)); e.f |= HEAD_EFFECT; + + if (!hydrating) { + if (e.nodes === null) { + e.nodes = { start: anchor, end: anchor, a: null, t: null }; + } else { + e.nodes.end = anchor; + } + } }); } finally { if (was_hydrating) { diff --git a/packages/svelte/tests/runtime-runes/samples/svelte-head-anchor-cleanup/Head.svelte b/packages/svelte/tests/runtime-runes/samples/svelte-head-anchor-cleanup/Head.svelte new file mode 100644 index 0000000000..fa5ae4a349 --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/svelte-head-anchor-cleanup/Head.svelte @@ -0,0 +1,3 @@ + + + diff --git a/packages/svelte/tests/runtime-runes/samples/svelte-head-anchor-cleanup/_config.js b/packages/svelte/tests/runtime-runes/samples/svelte-head-anchor-cleanup/_config.js new file mode 100644 index 0000000000..57ef735497 --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/svelte-head-anchor-cleanup/_config.js @@ -0,0 +1,19 @@ +import { flushSync } from 'svelte'; +import { ok, test } from '../../test'; + +export default test({ + mode: ['client', 'hydrate'], + + test({ assert, target, window }) { + const initial = window.document.head.childNodes.length; + const button = target.querySelector('button'); + ok(button); + + for (let i = 0; i < 3; i++) { + flushSync(() => button.click()); + flushSync(() => button.click()); + } + + assert.equal(window.document.head.childNodes.length, initial); + } +}); diff --git a/packages/svelte/tests/runtime-runes/samples/svelte-head-anchor-cleanup/main.svelte b/packages/svelte/tests/runtime-runes/samples/svelte-head-anchor-cleanup/main.svelte new file mode 100644 index 0000000000..f4cfefbadf --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/svelte-head-anchor-cleanup/main.svelte @@ -0,0 +1,11 @@ + + + + +{#if show} + +{/if}