Last active
February 9, 2022 17:26
-
-
Save Ch4s3/49a018d32e93bbf7d52064ad9b314d78 to your computer and use it in GitHub Desktop.
decaffeinated version of https://gist.github.com/Enalmada/6e11191c1ea81a75a4f266e147569096 with a flag for turning it on or off
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* decaffeinate suggestions: | |
* DS102: Remove unnecessary code created because of implicit returns | |
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md | |
*/ | |
const OldHttpRequest = Turbolinks.HttpRequest; | |
Turbolinks.CachedHttpRequest = class CachedHttpRequest extends Turbolinks.HttpRequest { | |
constructor(_, location, referrer) { | |
super(); | |
super(this, location, referrer); | |
} | |
requestCompletedWithResponse(response, redirectedToLocation) { | |
this.response = response; | |
return(this.redirect = redirectedToLocation); | |
} | |
requestFailedWithStatusCode(code) { | |
return(this.failCode = code); | |
} | |
oldSend() { | |
if (this.xhr && !this.sent) { | |
this.notifyApplicationBeforeRequestStart(); | |
this.setProgress(0); | |
this.xhr.send(); | |
this.sent = true; | |
return(this.delegate, 'requestStarted', o => o.requestStarted()); | |
} | |
} | |
send() { | |
if (this.failCode) { | |
return(this.delegate.requestFailedWithStatusCode(this.failCode, this.failText)); | |
} else if (this.response) { | |
return(this.delegate.requestCompletedWithResponse(this.response, this.redirect)); | |
} else { | |
return(this.oldSend()); | |
} | |
} | |
}; | |
Turbolinks.HttpRequest = class HttpRequest { | |
constructor(delegate, location, referrer) { | |
const cache = Turbolinks.controller.cache.get(`prefetch${location}`); | |
if (cache) { | |
//Turbolinks.controller.cache = new Turbolinks.SnapshotCache 10 | |
Turbolinks.controller.cache.delete(`prefetch${location}`); | |
console.log(JSON.stringify(Turbolinks.controller.cache.keys)); | |
cache.delegate = delegate; | |
return cache; | |
} else { | |
return(new OldHttpRequest(delegate, location, referrer)); | |
} | |
} | |
}; | |
Turbolinks.SnapshotCache.prototype.delete = function(location) { | |
const key = Turbolinks.Location.wrap(location).toCacheKey(); | |
return(delete this.snapshots[key]); | |
}; | |
const preloadAttribute = function(link) { | |
const linkAttr = link.attributes['data-turbolinks-preload'] | |
if (!linkAttr || linkAttr.value === 'false') { | |
return false; | |
} else { | |
return true; | |
} | |
} | |
const isNotGetMethod = function(link) { | |
link.attributes['data-method'] && (link.attributes['data-method'].value !== 'get') | |
} | |
//This function returns true if the link or location shouldn't be | |
const notPreloadable = function(link, location){ | |
if (preloadAttribute(link) === false) { | |
return true; | |
} else if (isNotGetMethod(link)) { | |
return true; | |
} else if (location.anchor || location.absoluteURL.endsWith("#")) { | |
return true; | |
} else if (location.absoluteURL === window.location.href) { | |
return true; | |
} else { | |
return false; | |
} | |
} | |
const preload = function(event) { | |
let link = Turbolinks.controller.getVisitableLinkForNode(event.target); | |
if (link) { | |
let location = Turbolinks.controller.getVisitableLocationForLink(link); | |
if (location) { | |
if (Turbolinks.controller.applicationAllowsFollowingLinkToLocation(link, location)) { | |
if (notPreloadable(link, location)) { | |
return; | |
} | |
// If Turbolinks has already cached this location internally, use that default behavior | |
// otherwise we can try and prefetch it here | |
let cache = Turbolinks.controller.cache.get(location); | |
if (!cache) { | |
cache = Turbolinks.controller.cache.get(`prefetch${location}`); | |
} | |
if (!cache) { | |
const request = new Turbolinks.CachedHttpRequest(null, location, window.location); | |
Turbolinks.controller.cache.put(`prefetch${location}`, request); | |
return(request.send()); | |
} | |
} | |
} | |
} | |
}; | |
document.addEventListener("touchstart", preload); | |
document.addEventListener("mouseover", preload); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
hi, currently i'm not using rails, prefetching only works on first page, when i clicked and redirected to another page, prefetching not works. what am i doing wrong ?
in html head tag,
<script defer src="https://cdn.jsdelivr.net/npm/[email protected]/dist/turbolinks.min.js"></script> <script src="custom.js"></script>i translated this coffeescript to javascript by http://js2.coffee/, then add it to turbolinks:load
document.addEventListener("turbolinks:load", () => {
// add code here
})