2014-05-22 06:20:38 +02:00
|
|
|
|
var on = require("../events/on")
|
2018-03-06 10:06:38 +00:00
|
|
|
|
var clone = require("../util/clone")
|
2014-05-22 06:20:38 +02:00
|
|
|
|
|
2018-03-19 22:08:56 -04:00
|
|
|
|
var attrState = "data-pjax-state"
|
2014-05-22 06:20:38 +02:00
|
|
|
|
|
|
|
|
|
|
var linkAction = function(el, event) {
|
2018-03-20 18:44:15 -04:00
|
|
|
|
if (isDefaultPrevented(event)) {
|
2014-05-22 06:20:38 +02:00
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2018-03-20 18:44:15 -04:00
|
|
|
|
// 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)
|
2014-05-22 06:20:38 +02:00
|
|
|
|
|
2018-03-20 18:44:15 -04:00
|
|
|
|
var attrValue = checkIfShouldAbort(el, event)
|
|
|
|
|
|
if (attrValue) {
|
|
|
|
|
|
el.setAttribute(attrState, attrValue)
|
2014-05-22 06:20:38 +02:00
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
event.preventDefault()
|
|
|
|
|
|
|
|
|
|
|
|
// don’t do "nothing" if user try to reload the page by clicking the same link twice
|
2016-03-24 12:38:15 +01:00
|
|
|
|
if (
|
|
|
|
|
|
this.options.currentUrlFullReload &&
|
|
|
|
|
|
el.href === window.location.href.split("#")[0]
|
|
|
|
|
|
) {
|
2018-03-19 22:08:56 -04:00
|
|
|
|
el.setAttribute(attrState, "reload")
|
2015-01-28 18:27:16 -08:00
|
|
|
|
this.reload()
|
2014-05-22 06:20:38 +02:00
|
|
|
|
return
|
|
|
|
|
|
}
|
2018-01-23 13:22:31 -05:00
|
|
|
|
|
2018-03-19 22:08:56 -04:00
|
|
|
|
el.setAttribute(attrState, "load")
|
2017-12-21 00:12:09 -05:00
|
|
|
|
|
|
|
|
|
|
options.triggerElement = el
|
|
|
|
|
|
this.loadUrl(el.href, options)
|
2014-05-22 06:20:38 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
2018-03-20 18:44:15 -04:00
|
|
|
|
function checkIfShouldAbort(el, event) {
|
|
|
|
|
|
// 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) {
|
|
|
|
|
|
return "modifier"
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 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) {
|
|
|
|
|
|
return "external"
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Ignore anchors on the same page (keep native behavior)
|
|
|
|
|
|
if (el.hash && el.href.replace(el.hash, "") === window.location.href.replace(location.hash, "")) {
|
|
|
|
|
|
return "anchor"
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Ignore empty anchor "foo.html#"
|
|
|
|
|
|
if (el.href === window.location.href.split("#")[0] + "#") {
|
|
|
|
|
|
return "anchor-empty"
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2016-01-04 23:09:04 +11:00
|
|
|
|
var isDefaultPrevented = function(event) {
|
2018-02-02 09:52:44 -05:00
|
|
|
|
return event.defaultPrevented || event.returnValue === false
|
2016-01-04 23:09:04 +11:00
|
|
|
|
}
|
|
|
|
|
|
|
2014-05-22 06:20:38 +02:00
|
|
|
|
module.exports = function(el) {
|
2014-10-14 11:42:36 +02:00
|
|
|
|
var that = this
|
2014-05-22 06:20:38 +02:00
|
|
|
|
|
2018-03-19 22:08:56 -04:00
|
|
|
|
el.setAttribute(attrState, "")
|
2016-01-04 23:09:04 +11:00
|
|
|
|
|
2018-03-20 18:44:15 -04:00
|
|
|
|
on(el, "click", function(event) {
|
2014-10-14 11:42:36 +02:00
|
|
|
|
linkAction.call(that, el, event)
|
2014-05-22 06:20:38 +02:00
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
on(el, "keyup", function(event) {
|
2018-02-02 09:52:44 -05:00
|
|
|
|
if (event.keyCode === 13) {
|
2014-10-14 11:42:36 +02:00
|
|
|
|
linkAction.call(that, el, event)
|
2014-05-22 06:20:38 +02:00
|
|
|
|
}
|
|
|
|
|
|
}.bind(this))
|
|
|
|
|
|
}
|