From c2f3a2aac05f75da791ff0788c681392ef68979f Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Sun, 18 Mar 2018 21:41:47 -0400 Subject: [PATCH] prefetch on mouse stop (#140) --- src/runtime/index.ts | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/runtime/index.ts b/src/runtime/index.ts index 347fbee..5e643be 100644 --- a/src/runtime/index.ts +++ b/src/runtime/index.ts @@ -214,7 +214,7 @@ let prefetching: { export function prefetch(href: string) { const selected = select_route(new URL(href, document.baseURI)); - if (selected) { + if (selected && (!prefetching || href !== prefetching.href)) { prefetching = { href, promise: selected.route.load().then(mod => prepare_route(mod.default, selected.data)) @@ -222,7 +222,16 @@ export function prefetch(href: string) { } } -function handle_touchstart_mouseover(event: MouseEvent | TouchEvent) { +let mousemove_timeout: NodeJS.Timer; + +function handle_mousemove(event: MouseEvent) { + clearTimeout(mousemove_timeout); + mousemove_timeout = setTimeout(() => { + trigger_prefetch(event); + }, 20); +} + +function trigger_prefetch(event: MouseEvent | TouchEvent) { const a: HTMLAnchorElement = findAnchor(event.target); if (!a || a.rel !== 'prefetch') return; @@ -248,8 +257,8 @@ export function init(_target: Node, _routes: Route[], opts?: { store?: (data: an window.addEventListener('popstate', handle_popstate); // prefetch - window.addEventListener('touchstart', handle_touchstart_mouseover); - window.addEventListener('mouseover', handle_touchstart_mouseover); + window.addEventListener('touchstart', trigger_prefetch); + window.addEventListener('mousemove', handle_mousemove); inited = true; }