describe("hx-on:* attribute", function() { beforeEach(function () { this.server = makeServer(); clearWorkArea(); }); afterEach(function () { this.server.restore(); clearWorkArea(); }); it("can handle basic events w/ no other attributes", function () { var btn = make(""); btn.click(); window.foo.should.equal(true); delete window.foo; }); it("can use dashes rather than colons", function () { var btn = make(""); btn.click(); window.foo.should.equal(true); delete window.foo; }); it("can modify a parameter via htmx:configRequest", function () { this.server.respondWith("POST", "/test", function (xhr) { var params = parseParams(xhr.requestBody); xhr.respond(200, {}, params.foo); }); var btn = make(""); btn.click(); this.server.respond(); btn.innerText.should.equal("bar"); }); it("can modify a parameter via htmx:configRequest with dashes", function () { this.server.respondWith("POST", "/test", function (xhr) { var params = parseParams(xhr.requestBody); xhr.respond(200, {}, params.foo); }); var btn = make(""); btn.click(); this.server.respond(); btn.innerText.should.equal("bar"); }); it("expands :: shorthand into htmx:", function () { this.server.respondWith("POST", "/test", function (xhr) { var params = parseParams(xhr.requestBody); xhr.respond(200, {}, params.foo); }); var btn = make(""); btn.click(); this.server.respond(); btn.innerText.should.equal("bar"); }); it("expands -- shorthand into htmx:", function () { this.server.respondWith("POST", "/test", function (xhr) { var params = parseParams(xhr.requestBody); xhr.respond(200, {}, params.foo); }); var btn = make(""); btn.click(); this.server.respond(); btn.innerText.should.equal("bar"); }); it("can cancel an event via preventDefault for htmx:config-request", function () { this.server.respondWith("POST", "/test", function (xhr) { xhr.respond(200, {}, ""); }); var btn = make(""); btn.click(); this.server.respond(); btn.innerText.should.equal("Foo"); }); it("can respond to data-hx-on", function () { this.server.respondWith("POST", "/test", function (xhr) { var params = parseParams(xhr.requestBody); xhr.respond(200, {}, params.foo); }); var btn = make(""); btn.click(); this.server.respond(); btn.innerText.should.equal("bar"); }); it("has the this symbol set to the element", function () { this.server.respondWith("POST", "/test", function (xhr) { xhr.respond(200, {}, "foo"); }); var btn = make(""); btn.click(); this.server.respond(); btn.innerText.should.equal("foo"); btn.should.equal(window.elt); delete window.elt; }); it("can handle multi-line JSON", function () { this.server.respondWith("POST", "/test", function (xhr) { xhr.respond(200, {}, "foo"); }); var btn = make(""); btn.click(); this.server.respond(); btn.innerText.should.equal("foo"); var obj = {foo: true, bar: false}; obj.should.deep.equal(window.elt); delete window.elt; }); it("can handle multiple event handlers in the presence of multi-line JSON", function () { this.server.respondWith("POST", "/test", function (xhr) { xhr.respond(200, {}, "foo"); }); var btn = make(""); btn.click(); this.server.respond(); btn.innerText.should.equal("foo"); var obj = {foo: true, bar: false}; obj.should.deep.equal(window.elt); delete window.elt; window.foo.should.equal(true); delete window.foo; }); it("de-initializes hx-on-* content properly", function () { window.tempCount = 0; this.server.respondWith("POST", "/test", function (xhr) { xhr.respond(200, {}, ""); }); var div = make("
Foo
"); // get response div.click(); this.server.respond(); // click button byId('foo').click(); window.tempCount.should.equal(1); // get second response div.click(); this.server.respond(); // click button again byId('foo').click(); window.tempCount.should.equal(2); delete window.tempCount; }); it("is not evaluated when allowEval is false", function () { var calledEvent = false; var handler = htmx.on("htmx:evalDisallowedError", function(){ calledEvent = true; }); htmx.config.allowEval = false; try { var btn = make(""); btn.click(); should.not.exist(window.foo); } finally { htmx.config.allowEval = true; htmx.off("htmx:evalDisallowedError", handler); delete window.foo; } calledEvent.should.equal(true); }); it("can handle being swapped using innerHTML", function () { this.server.respondWith("GET", "/test", function (xhr) { xhr.respond(200, {}, ''); }); make( '
' + '' + '
' + '
' ); var fooBtn = byId("foo"); fooBtn.click(); window.foo.should.equal(true); var swapBtn = byId("swap"); swapBtn.click(); this.server.respond(); var barBtn = byId("bar"); barBtn.click(); window.bar.should.equal(true); delete window.foo; delete window.bar; }); it("cleans up all handlers when the DOM updates", function () { // setup window.foo = 0; window.bar = 0; var div = make("
Foo
"); make("
Another Div
"); // sole purpose is to update the DOM // check there is just one handler against each event htmx.trigger(div, "increment-foo"); htmx.trigger(div, "increment-bar"); window.foo.should.equal(1); window.bar.should.equal(1); // teardown delete window.foo; delete window.bar; }); });