123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- /*! 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
- }
- const urlObject = new URL(url)
- if (urlObject.origin != location.origin) {
- return
- }
- urlBeingPreloaded = url
- if (!useAjaxFallback) {
- prefetcher.href = url
- console.log(`Preloading ${url}`)
- }
- else {
- console.log(`Todo: preload with Ajax ${url}`)
- }
- }
- function stopPreloading() {
- if (!urlBeingPreloaded) {
- return
- }
- 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()`)
- }
- }
|