From ee82d0e0c70323048b9994cc9a8c3239b464e47c Mon Sep 17 00:00:00 2001 From: Behind The Math Date: Mon, 19 Mar 2018 22:08:56 -0400 Subject: [PATCH] Fix bug when checking if elements were parsed already 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. --- lib/proto/attach-link.js | 24 +++++++++--------------- lib/proto/parse-element.js | 4 ++-- tests/lib/proto/attach-link.js | 2 +- 3 files changed, 12 insertions(+), 18 deletions(-) diff --git a/lib/proto/attach-link.js b/lib/proto/attach-link.js index 7de3317..bb48902 100644 --- a/lib/proto/attach-link.js +++ b/lib/proto/attach-link.js @@ -1,8 +1,7 @@ var on = require("../events/on") var clone = require("../util/clone") -var attrClick = "data-pjax-click-state" -var attrKey = "data-pjax-keyup-state" +var attrState = "data-pjax-state" var linkAction = function(el, event) { // Since loadUrl modifies options and we may add our own modifications below, @@ -11,7 +10,7 @@ var linkAction = function(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) { - el.setAttribute(attrClick, "modifier") + el.setAttribute(attrState, "modifier") return } @@ -20,25 +19,25 @@ var linkAction = function(el, event) { // Ignore external links. if (el.protocol !== window.location.protocol || el.host !== window.location.host) { - el.setAttribute(attrClick, "external") + 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(attrClick, "anchor-present") + 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(attrClick, "anchor") + el.setAttribute(attrState, "anchor") return } // Ignore empty anchor "foo.html#" if (el.href === window.location.href.split("#")[0] + "#") { - el.setAttribute(attrClick, "anchor-empty") + el.setAttribute(attrState, "anchor-empty") return } @@ -49,12 +48,12 @@ var linkAction = function(el, event) { this.options.currentUrlFullReload && el.href === window.location.href.split("#")[0] ) { - el.setAttribute(attrClick, "reload") + el.setAttribute(attrState, "reload") this.reload() return } - el.setAttribute(attrClick, "load") + el.setAttribute(attrState, "load") options.triggerElement = el this.loadUrl(el.href, options) @@ -71,6 +70,7 @@ module.exports = function(el) { if (isDefaultPrevented(event)) { return } + el.setAttribute(attrState, "") linkAction.call(that, el, event) }) @@ -80,12 +80,6 @@ module.exports = function(el) { 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) } diff --git a/lib/proto/parse-element.js b/lib/proto/parse-element.js index e79b4e0..02659d9 100644 --- a/lib/proto/parse-element.js +++ b/lib/proto/parse-element.js @@ -2,14 +2,14 @@ module.exports = function(el) { switch (el.tagName.toLowerCase()) { case "a": // only attach link if el does not already have link attached - if (!el.hasAttribute("data-pjax-click-state")) { + if (!el.hasAttribute("data-pjax-state")) { this.attachLink(el) } break case "form": // only attach link if el does not already have link attached - if (!el.hasAttribute("data-pjax-click-state")) { + if (!el.hasAttribute("data-pjax-state")) { this.attachForm(el) } break diff --git a/tests/lib/proto/attach-link.js b/tests/lib/proto/attach-link.js index cae020a..0886340 100644 --- a/tests/lib/proto/attach-link.js +++ b/tests/lib/proto/attach-link.js @@ -5,7 +5,7 @@ var trigger = require("../../../lib/events/trigger") var attachLink = require("../../../lib/proto/attach-link") var a = document.createElement("a") -var attr = "data-pjax-click-state" +var attr = "data-pjax-state" var preventDefault = function(e) { e.preventDefault() } tape("test attach link prototype method", function(t) {