|
@@ -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()`)
|
|
|
|
+ }
|
|
|
|
+}
|