/* InstantClick 2.1 | (C) 2014 Alexandre Dieulot | http://instantclick.io/license.html */ var InstantClick = function(document, location) { var currentLocationWithoutHash var urlToPreload var preloadTimer var pHistory = {} // short for "preloadHistory" var p = {} // short for "preloads" var useBlacklist = true var preloadOnMousedown var delayBeforePreload var listeners = {change: []} ////////// HELPERS ////////// function removeHash(url) { var index = url.indexOf('#') if (index == -1) { return url } return url.substr(0, index) } function getLinkTarget(target) { while (target.nodeName != 'A') { target = target.parentNode } return target } function triggerPageEvent(type) { for (var i = 0; i < listeners[type].length; i++) { listeners[type][i]() } } function changePage(title, body) { var doc = document.implementation.createHTMLDocument('') doc.documentElement.innerHTML = body document.documentElement.replaceChild(doc.body, document.body) var elem = document.createElement('i') elem.innerHTML = title document.title = elem.textContent } ////////// EVENT HANDLERS ////////// function mousedown(e) { preload(getLinkTarget(e.target).href) } function mouseover(e) { var a = getLinkTarget(e.target) a.addEventListener('mouseout', mouseout) if (!delayBeforePreload) { preload(a.href) } else { urlToPreload = a.href preloadTimer = setTimeout(preload, delayBeforePreload) } } function click(e) { if (e.which > 1 || e.metaKey || e.ctrlKey) { // Opening in new tab return } e.preventDefault() display(getLinkTarget(e.target).href) } function mouseout() { if (preloadTimer) { clearTimeout(preloadTimer) preloadTimer = false return } if (!p.isPreloading || (p.isPreloading && p.isWaitingForCompletion)) { return } p.xhr.abort() p.isPreloading = false p.isWaitingForCompletion = false } function readystatechange(e) { if (p.xhr.readyState < 4) { return } if (p.xhr.status == 0) { // Aborted return } p.timing.ready = +new Date - p.timing.start var text = p.xhr.responseText var titleIndex = text.indexOf('