diff --git a/src/runtime/blockdom/event_catcher.ts b/src/runtime/blockdom/event_catcher.ts
index bd59d577..a32edfe9 100644
--- a/src/runtime/blockdom/event_catcher.ts
+++ b/src/runtime/blockdom/event_catcher.ts
@@ -46,7 +46,7 @@ export function createCatcher(eventsSpec: EventsSpec): Catcher {
const target = ev.target;
let currentNode: any = self.child.firstNode();
const afterNode = self.afterNode;
- while (currentNode !== afterNode) {
+ while (currentNode && currentNode !== afterNode) {
if (currentNode.contains(target)) {
return origFn.call(this, ev);
}
diff --git a/tests/components/__snapshots__/t_on.test.ts.snap b/tests/components/__snapshots__/t_on.test.ts.snap
index 76652047..c3a942cd 100644
--- a/tests/components/__snapshots__/t_on.test.ts.snap
+++ b/tests/components/__snapshots__/t_on.test.ts.snap
@@ -456,3 +456,45 @@ exports[`t-on t-on on t-slots 2`] = `
}
}"
`;
+
+exports[`t-on t-on when first component child is an empty component 1`] = `
+"function anonymous(app, bdom, helpers
+) {
+ let { text, createBlock, list, multi, html, toggler, comment } = bdom;
+ let { createCatcher } = helpers;
+ const comp1 = app.createComponent(\`Child\`, true, false, false, false);
+ const catcher1 = createCatcher({\\"click\\":0});
+
+ let block1 = createBlock(\`
\`);
+
+ return function template(ctx, node, key = \\"\\") {
+ let hdlr1 = [ctx['push'], ctx];
+ const hdlr2 = [()=>{}, ctx];
+ const b2 = catcher1(comp1({list: ctx['list']}, key + \`__1\`, node, this, null), [hdlr2]);
+ return block1([hdlr1], [b2]);
+ }
+}"
+`;
+
+exports[`t-on t-on when first component child is an empty component 2`] = `
+"function anonymous(app, bdom, helpers
+) {
+ let { text, createBlock, list, multi, html, toggler, comment } = bdom;
+ let { prepareList, withKey } = helpers;
+
+ let block2 = createBlock(\`\`);
+
+ return function template(ctx, node, key = \\"\\") {
+ ctx = Object.create(ctx);
+ const [k_block1, v_block1, l_block1, c_block1] = prepareList(ctx['props'].list);;
+ for (let i1 = 0; i1 < l_block1; i1++) {
+ ctx[\`c\`] = v_block1[i1];
+ ctx[\`c_index\`] = i1;
+ const key1 = ctx['c_index'];
+ let txt1 = ctx['c'];
+ c_block1[i1] = withKey(block2([txt1]), key1);
+ }
+ return list(c_block1);
+ }
+}"
+`;
diff --git a/tests/components/t_on.test.ts b/tests/components/t_on.test.ts
index 6acf4c6a..c4b910e0 100644
--- a/tests/components/t_on.test.ts
+++ b/tests/components/t_on.test.ts
@@ -41,6 +41,30 @@ describe("t-on", () => {
expect(steps).toEqual(["click"]);
});
+ test("t-on when first component child is an empty component", async () => {
+ class Child extends Component {
+ static template = xml`
+
+ `;
+ }
+ class Parent extends Component {
+ static template = xml`
+
+ `;
+ static components = { Child };
+ list = useState([] as string[]);
+ push() {
+ this.list.push("foo");
+ }
+ }
+ const parent = await mount(Parent, fixture);
+ const el = elem(parent);
+ expect(el.innerHTML).toBe("");
+ el.click();
+ await nextTick();
+ expect(el.innerHTML).toBe("foo");
+ });
+
test("t-on expression in t-foreach", async () => {
class Comp extends Component {
static template = xml`