Jelajahi Sumber

Prefetch on mouseover and abort on mouseout

Alexandre Dieulot 6 tahun lalu
induk
melakukan
bd59825254
1 mengubah file dengan 62 tambahan dan 1 penghapusan
  1. 62 1
      instantpage.js

+ 62 - 1
instantpage.js

@@ -1 +1,62 @@
-console.log('instantpage')
+/*! instant.page v0.0.0 - (C) 2019 Alexandre Dieulot - https://instant.page/license */
+
+let urlBeingPreloaded
+
+const prefetcher = document.createElement('link')
+const useAjaxFallback = !(prefetcher.relList && prefetcher.relList.supports && prefetcher.relList.supports('prefetch'))
+
+if (!useAjaxFallback) {
+  prefetcher.rel = 'prefetch'
+  document.head.appendChild(prefetcher)
+}
+
+document.addEventListener('mouseover', mouseoverListener, true)
+
+function mouseoverListener(event) {
+  const linkElement = event.target.closest('a')
+
+  if (!linkElement) {
+    return
+  }
+
+  linkElement.addEventListener('mouseout', mouseoutListener)
+
+  preload(linkElement.href)
+}
+
+function mouseoutListener(event) {
+  if (event.relatedTarget && event.target.closest('a') == event.relatedTarget.closest('a')) {
+    return
+  }
+
+  stopPreloading()
+}
+
+function preload(url) {
+  if (urlBeingPreloaded == url) {
+    return
+  }
+  urlBeingPreloaded = url
+
+  if (!useAjaxFallback) {
+    prefetcher.href = url
+    console.log(`Preloading ${url}`)
+  }
+  else {
+    console.log(`Todo: preload with Ajax ${url}`)
+  }
+}
+
+function stopPreloading() {
+  urlBeingPreloaded = undefined
+
+  if (!useAjaxFallback) {
+    /* The spec says an empty string should abort the prefetching
+     * but Firefox 64 interprets it as a relative URL to prefetch. */
+    prefetcher.removeAttribute('href')
+    console.log(`Stopped preloading`)
+  }
+  else {
+    console.log(`Todo: stop preloading with xhr.abort()`)
+  }
+}