mirror of
https://github.com/bigskysoftware/htmx.git
synced 2025-10-02 15:25:26 +00:00

properly clean up events from event handlers (also handle corner case where multiple listeners are added for the same even)
123 lines
4.4 KiB
JavaScript
123 lines
4.4 KiB
JavaScript
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("<button hx-on='click: window.foo = true'>Foo</button>");
|
|
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("<button hx-on='htmx:configRequest: event.detail.parameters.foo = \"bar\"' hx-post='/test'>Foo</button>");
|
|
btn.click();
|
|
this.server.respond();
|
|
btn.innerText.should.equal("bar");
|
|
});
|
|
|
|
it("can cancel an event via preventDefault for htmx:configRequest", function () {
|
|
this.server.respondWith("POST", "/test", function (xhr) {
|
|
xhr.respond(200, {}, "<button>Bar</button>");
|
|
});
|
|
var btn = make("<button hx-on='htmx:configRequest: event.preventDefault()' hx-post='/test' hx-swap='outerHTML'>Foo</button>");
|
|
btn.click();
|
|
this.server.respond();
|
|
btn.innerText.should.equal("Foo");
|
|
});
|
|
|
|
it("can respond to kebab-case events", function () {
|
|
this.server.respondWith("POST", "/test", function (xhr) {
|
|
var params = parseParams(xhr.requestBody);
|
|
xhr.respond(200, {}, params.foo);
|
|
});
|
|
var btn = make("<button hx-on='htmx:config-request: event.detail.parameters.foo = \"bar\"' hx-post='/test'>Foo</button>");
|
|
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("<button hx-on='htmx:config-request: window.elt = this' hx-post='/test'>Foo</button>");
|
|
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("<button hx-on='htmx:config-request: window.elt = {foo: true,\n" +
|
|
" bar: false}' hx-post='/test'>Foo</button>");
|
|
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("<button hx-on='htmx:config-request: window.elt = {foo: true,\n" +
|
|
" bar: false}\n" +
|
|
" htmx:afterRequest: window.foo = true'" +
|
|
" hx-post='/test'>Foo</button>");
|
|
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, {}, "<button id='foo' hx-on=\"click: window.tempCount++;\">increment</button>");
|
|
});
|
|
var div = make("<div hx-post='/test'>Foo</div>");
|
|
|
|
// 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;
|
|
});
|
|
|
|
});
|