* Lots of code cleanup * Cleanup parse-options tests - Rename objects for clarity and inline unneeded objects - Remove unneeded tests - Use Object.keys().length instead of a custom function - Use typeof === "object" instead of a custom function that checks the prototype tree as well, since we don't expect anything but an object literal. * Remove old switchFallback code * Remove polyfill for Function.prototype.bind * Inline small functions * Add more documentation and tests for options.currentUrlFullReload Closes #17 * Update package.json
97 lines
2.6 KiB
JavaScript
97 lines
2.6 KiB
JavaScript
var on = require("../events/on")
|
||
var clone = require("../clone")
|
||
|
||
var attrClick = "data-pjax-click-state"
|
||
var attrKey = "data-pjax-keyup-state"
|
||
|
||
var linkAction = function(el, event) {
|
||
// Since loadUrl modifies options and we may add our own modifications below,
|
||
// clone it so the changes don't persist
|
||
var options = clone(this.options)
|
||
|
||
// Initialize requestOptions since loadUrl expects it to be an object
|
||
options.requestOptions = {}
|
||
|
||
// Don’t break browser special behavior on links (like page in new window)
|
||
if (event.which > 1 || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) {
|
||
el.setAttribute(attrClick, "modifier")
|
||
return
|
||
}
|
||
|
||
// we do test on href now to prevent unexpected behavior if for some reason
|
||
// user have href that can be dynamically updated
|
||
|
||
// Ignore external links.
|
||
if (el.protocol !== window.location.protocol || el.host !== window.location.host) {
|
||
el.setAttribute(attrClick, "external")
|
||
return
|
||
}
|
||
|
||
// Ignore click if we are on an anchor on the same page
|
||
if (el.pathname === window.location.pathname && el.hash.length > 0) {
|
||
el.setAttribute(attrClick, "anchor-present")
|
||
return
|
||
}
|
||
|
||
// Ignore anchors on the same page (keep native behavior)
|
||
if (el.hash && el.href.replace(el.hash, "") === window.location.href.replace(location.hash, "")) {
|
||
el.setAttribute(attrClick, "anchor")
|
||
return
|
||
}
|
||
|
||
// Ignore empty anchor "foo.html#"
|
||
if (el.href === window.location.href.split("#")[0] + "#") {
|
||
el.setAttribute(attrClick, "anchor-empty")
|
||
return
|
||
}
|
||
|
||
event.preventDefault()
|
||
|
||
// don’t do "nothing" if user try to reload the page by clicking the same link twice
|
||
if (
|
||
this.options.currentUrlFullReload &&
|
||
el.href === window.location.href.split("#")[0]
|
||
) {
|
||
el.setAttribute(attrClick, "reload")
|
||
this.reload()
|
||
return
|
||
}
|
||
|
||
el.setAttribute(attrClick, "load")
|
||
|
||
options.triggerElement = el
|
||
this.loadUrl(el.href, options)
|
||
}
|
||
|
||
var isDefaultPrevented = function(event) {
|
||
return event.defaultPrevented || event.returnValue === false
|
||
}
|
||
|
||
module.exports = function(el) {
|
||
var that = this
|
||
|
||
on(el, "click", function(event) {
|
||
if (isDefaultPrevented(event)) {
|
||
return
|
||
}
|
||
|
||
linkAction.call(that, el, event)
|
||
})
|
||
|
||
on(el, "keyup", function(event) {
|
||
if (isDefaultPrevented(event)) {
|
||
return
|
||
}
|
||
|
||
// Don’t break browser special behavior on links (like page in new window)
|
||
if (event.which > 1 || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) {
|
||
el.setAttribute(attrKey, "modifier")
|
||
return
|
||
}
|
||
|
||
if (event.keyCode === 13) {
|
||
linkAction.call(that, el, event)
|
||
}
|
||
}.bind(this))
|
||
}
|