mirror of
https://github.com/bigskysoftware/htmx.git
synced 2026-04-19 21:36:31 +00:00
properly clean up events from event handlers (also handle corner case where multiple listeners are added for the same even)
This commit is contained in:
@@ -921,8 +921,9 @@ return (function () {
|
||||
});
|
||||
}
|
||||
if (internalData.onHandlers) {
|
||||
for (var eventName of internalData.onHandlers) {
|
||||
element.removeEventListener(eventName, internalData.onHandlers[eventName]);
|
||||
for (let i = 0; i < internalData.onHandlers.length; i++) {
|
||||
const handlerInfo = internalData.onHandlers[i];
|
||||
element.removeEventListener(handlerInfo.name, handlerInfo.handler);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1867,12 +1868,12 @@ return (function () {
|
||||
|
||||
function addHxOnEventHandler(elt, eventName, code) {
|
||||
var nodeData = getInternalData(elt);
|
||||
nodeData.onHandlers ||= {};
|
||||
nodeData.onHandlers = [];
|
||||
var func = new Function("event", code + "; return;");
|
||||
var listener = elt.addEventListener(eventName, function (e) {
|
||||
return func.call(elt, e);
|
||||
});
|
||||
nodeData.onHandlers[eventName] = listener;
|
||||
nodeData.onHandlers.push({event:eventName, listener:listener});
|
||||
return {nodeData, code, func, listener};
|
||||
}
|
||||
|
||||
|
||||
@@ -93,4 +93,30 @@ describe("hx-on attribute", function() {
|
||||
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;
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user