instantpage.js 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. /*! instant.page v0.0.0 - (C) 2019 Alexandre Dieulot - https://instant.page/license */
  2. let urlBeingPreloaded
  3. const prefetcher = document.createElement('link')
  4. const useAjaxFallback = !(prefetcher.relList && prefetcher.relList.supports && prefetcher.relList.supports('prefetch'))
  5. if (!useAjaxFallback) {
  6. prefetcher.rel = 'prefetch'
  7. document.head.appendChild(prefetcher)
  8. }
  9. document.addEventListener('mouseover', mouseoverListener, true)
  10. function mouseoverListener(event) {
  11. const linkElement = event.target.closest('a')
  12. if (!linkElement) {
  13. return
  14. }
  15. linkElement.addEventListener('mouseout', mouseoutListener)
  16. preload(linkElement.href)
  17. }
  18. function mouseoutListener(event) {
  19. if (event.relatedTarget && event.target.closest('a') == event.relatedTarget.closest('a')) {
  20. return
  21. }
  22. stopPreloading()
  23. }
  24. function preload(url) {
  25. if (urlBeingPreloaded == url) {
  26. return
  27. }
  28. urlBeingPreloaded = url
  29. if (!useAjaxFallback) {
  30. prefetcher.href = url
  31. console.log(`Preloading ${url}`)
  32. }
  33. else {
  34. console.log(`Todo: preload with Ajax ${url}`)
  35. }
  36. }
  37. function stopPreloading() {
  38. urlBeingPreloaded = undefined
  39. if (!useAjaxFallback) {
  40. /* The spec says an empty string should abort the prefetching
  41. * but Firefox 64 interprets it as a relative URL to prefetch. */
  42. prefetcher.removeAttribute('href')
  43. console.log(`Stopped preloading`)
  44. }
  45. else {
  46. console.log(`Todo: stop preloading with xhr.abort()`)
  47. }
  48. }