instantpage.js 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  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. const urlObject = new URL(url)
  29. if (urlObject.origin != location.origin) {
  30. return
  31. }
  32. urlBeingPreloaded = url
  33. if (!useAjaxFallback) {
  34. prefetcher.href = url
  35. console.log(`Preloading ${url}`)
  36. }
  37. else {
  38. console.log(`Todo: preload with Ajax ${url}`)
  39. }
  40. }
  41. function stopPreloading() {
  42. if (!urlBeingPreloaded) {
  43. return
  44. }
  45. urlBeingPreloaded = undefined
  46. if (!useAjaxFallback) {
  47. /* The spec says an empty string should abort the prefetching
  48. * but Firefox 64 interprets it as a relative URL to prefetch. */
  49. prefetcher.removeAttribute('href')
  50. console.log(`Stopped preloading`)
  51. }
  52. else {
  53. console.log(`Todo: stop preloading with xhr.abort()`)
  54. }
  55. }