Skip to content

Instantly share code, notes, and snippets.

@yordis
Last active July 2, 2017 00:30
Show Gist options
  • Save yordis/ad942d80ae283891565ba159ebae0f24 to your computer and use it in GitHub Desktop.
Save yordis/ad942d80ae283891565ba159ebae0f24 to your computer and use it in GitHub Desktop.

Javascript Snippets

document.addEventListener('DOMContentLoaded', function(event) {
document.addEventListener('click', onClick)
function onClick(event) {
if(isTurboElement(event.target)) {
event.preventDefault()
visit(event.target)
}
}
function isTurboElement(element) {
return element.nodeName === 'A' && element.getAttribute('target') === null
}
function visit(element) {
var headers = createRequestHeaders()
var request = createRequest(element.href, headers, window.location.href)
fetch(request)
.then((response)=> { return response.text() })
.then(updateCurrentDocument)
.then(()=> { history.pushState(null, null, element.href) })
}
function createRequestHeaders() {
return new Headers({
'Accept': 'text/html, application/xhtml+xml',
'X-Turbo-Request': 'true'
})
}
function createRequest(url, headers, referrer) {
return new Request(url, {
headers: headers,
referrer: referrer || ''
})
}
function updateCurrentDocument(html) {
var element = document.createElement('html')
element.innerHTML = html
var title = element.querySelector('title').innerText
var body = element.querySelector('body').cloneNode(true)
activateScripts(body.querySelectorAll('script'))
return applyChanges(title, body)
}
function applyChanges(title, body) {
document.querySelector('title').innerText = title
document.body = body
}
function activateScripts(scripts) {
var element, clone
for(var i = 0; i < scripts.length; i++) {
element = scripts[i]
clone = creatScriptTag(element)
element.parentNode.replaceChild(clone, element)
}
}
function creatScriptTag(element) {
var script = document.createElement("script")
script.textContent = element.textContent
if(element.src) { script.src = element.src }
return script
}
})
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment