diff --git a/src/default.js b/src/default.js index 41ecf1c..4706104 100644 --- a/src/default.js +++ b/src/default.js @@ -1143,6 +1143,7 @@ } } + var lastInlineElement; var inlineEvent = function (event) { var element = event.target; while ( @@ -1173,6 +1174,13 @@ .trim() .slice(0, 200) : ""; + } else { + // A label click also clicks its control, count one click per task + if (element === lastInlineElement) return; + lastInlineElement = element; + setTimeout(function () { + lastInlineElement = undefinedVar; + }); } sendEvent(name, metadata, undefinedVar, trueVar); }; diff --git a/test/unit/inline-events.test.js b/test/unit/inline-events.test.js index dbf5923..fd4b1ab 100644 --- a/test/unit/inline-events.test.js +++ b/test/unit/inline-events.test.js @@ -42,12 +42,13 @@ describe("inline events", function () { afterEach(() => windows.splice(0).forEach((window) => window.close())); - it("tracks nested clicks and new elements with current metadata", function () { + it("tracks nested clicks and new elements with current metadata", async function () { const dom = setup(); dom.window.document.body.innerHTML = ''; const button = dom.window.document.querySelector("button"); click(dom, button.firstChild); + await new Promise((resolve) => setTimeout(resolve, 10)); button.setAttribute("data-simple-event", "upgrade"); button.setAttribute("data-simple-event-plan-name", "enterprise"); click(dom, button); @@ -57,6 +58,24 @@ describe("inline events", function () { ]); }); + it("counts a label click once, and independent clicks separately", async function () { + const dom = setup(); + dom.window.document.body.innerHTML = + '
'; + const [forLabel, wrapLabel] = dom.window.document.querySelectorAll("label"); + const nextTask = () => new Promise((resolve) => setTimeout(resolve, 10)); + click(dom, forLabel); + await nextTask(); + click(dom, wrapLabel.querySelector("span")); + await nextTask(); + wrapLabel.control.click(); + await nextTask(); + forLabel.addEventListener("click", (event) => event.preventDefault()); + click(dom, forLabel); + expect(forLabel.control.checked).to.equal(true); + expect(events(dom)).to.have.length(4); + }); + it("leaves link behavior and modified clicks untouched", function () { const dom = setup(); dom.window.document.body.innerHTML =