diff --git a/.changeset/lazy-ways-swim.md b/.changeset/lazy-ways-swim.md new file mode 100644 index 000000000000..36c1de3aea90 --- /dev/null +++ b/.changeset/lazy-ways-swim.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix `sveltekit:prefetch` mouse detection diff --git a/packages/kit/src/runtime/client/router.js b/packages/kit/src/runtime/client/router.js index 927bbe59f088..81fb8941c67c 100644 --- a/packages/kit/src/runtime/client/router.js +++ b/packages/kit/src/runtime/client/router.js @@ -94,7 +94,7 @@ export class Router { }, 200); }); - /** @param {MouseEvent|TouchEvent} event */ + /** @param {Event} event */ const trigger_prefetch = (event) => { const a = find_anchor(event); if (a && a.href && a.hasAttribute('sveltekit:prefetch')) { @@ -109,12 +109,17 @@ export class Router { const handle_mousemove = (event) => { clearTimeout(mousemove_timeout); mousemove_timeout = setTimeout(() => { - trigger_prefetch(event); + // event.composedPath(), which is used in find_anchor, will be empty if the event is read in a timeout + // add a layer of indirection to address that + event.target?.dispatchEvent( + new CustomEvent('sveltekit:trigger_prefetch', { bubbles: true }) + ); }, 20); }; addEventListener('touchstart', trigger_prefetch); addEventListener('mousemove', handle_mousemove); + addEventListener('sveltekit:trigger_prefetch', trigger_prefetch); /** @param {MouseEvent} event */ addEventListener('click', (event) => {