parse-element.js checks if the element was already parsed by
checking for the `data-pjax-click-state` attribute. However, this
attribute was not added until the link is clicked.
Originally, there was a separate attribute, `data-pjax-enabled`,
which tracked if the element was parsed already, but that was
changed in 9a86044.
This commit merges the attributes for mouse clicks and key presses
into one and adds that attribute when the element is initially
parsed.
88 lines
2.3 KiB
JavaScript
88 lines
2.3 KiB
JavaScript
var on = require("../events/on")
|
||
var clone = require("../util/clone")
|
||
|
||
var attrState = "data-pjax-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)
|
||
|
||
// 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(attrState, "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(attrState, "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(attrState, "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(attrState, "anchor")
|
||
return
|
||
}
|
||
|
||
// Ignore empty anchor "foo.html#"
|
||
if (el.href === window.location.href.split("#")[0] + "#") {
|
||
el.setAttribute(attrState, "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(attrState, "reload")
|
||
this.reload()
|
||
return
|
||
}
|
||
|
||
el.setAttribute(attrState, "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
|
||
}
|
||
el.setAttribute(attrState, "")
|
||
|
||
linkAction.call(that, el, event)
|
||
})
|
||
|
||
on(el, "keyup", function(event) {
|
||
if (isDefaultPrevented(event)) {
|
||
return
|
||
}
|
||
|
||
if (event.keyCode === 13) {
|
||
linkAction.call(that, el, event)
|
||
}
|
||
}.bind(this))
|
||
}
|