Skip to content

Commit 8e3afde

Browse files
committed
Fix delegated DOM events to bubble across ancestors
1 parent 3f42ed9 commit 8e3afde

1 file changed

Lines changed: 16 additions & 8 deletions

File tree

src/cli/generators.cc

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -965,55 +965,63 @@ namespace webcc
965965
if (used_event_listeners.count("click"))
966966
{
967967
w.write("");
968-
w.write("// Global click event delegation - walks up DOM tree to find handler");
968+
w.write("// Global click delegation with bubbling semantics (target -> ancestors)");
969969
w.write("document.body.addEventListener('click', (e) => {");
970970
w.write(" let el = e.target;");
971+
w.write(" let pushed = false;");
971972
w.write(" while (el && el !== document.body) {");
972-
w.write(" if (el.dataset.c) { push_event_dom_CLICK(parseInt(el.dataset.c)); _triggerDiscreteUpdate(); return; }");
973+
w.write(" if (el.dataset.c) { push_event_dom_CLICK(parseInt(el.dataset.c)); pushed = true; }");
973974
w.write(" el = el.parentElement;");
974975
w.write(" }");
976+
w.write(" if (pushed) _triggerDiscreteUpdate();");
975977
w.write("});");
976978
}
977979

978980
if (used_event_listeners.count("input"))
979981
{
980982
w.write("");
981-
w.write("// Global input event delegation - walks up DOM tree to find handler");
983+
w.write("// Global input delegation with bubbling semantics (target -> ancestors)");
982984
w.write("document.body.addEventListener('input', (e) => {");
983985
w.write(" let el = e.target;");
986+
w.write(" let pushed = false;");
984987
w.write(" while (el && el !== document.body) {");
985-
w.write(" if (el.dataset.i) { push_event_dom_INPUT(parseInt(el.dataset.i), e.target.value || ''); _triggerDiscreteUpdate(); return; }");
988+
w.write(" if (el.dataset.i) { push_event_dom_INPUT(parseInt(el.dataset.i), e.target.value || ''); pushed = true; }");
986989
w.write(" el = el.parentElement;");
987990
w.write(" }");
991+
w.write(" if (pushed) _triggerDiscreteUpdate();");
988992
w.write("});");
989993
}
990994

991995
if (used_event_listeners.count("change"))
992996
{
993997
w.write("");
994-
w.write("// Global change event delegation - walks up DOM tree to find handler");
998+
w.write("// Global change delegation with bubbling semantics (target -> ancestors)");
995999
w.write("document.body.addEventListener('change', (e) => {");
9961000
w.write(" let el = e.target;");
1001+
w.write(" let pushed = false;");
9971002
w.write(" while (el && el !== document.body) {");
9981003
w.write(" if (el.dataset.g) {");
9991004
w.write(" const val = e.target.type === 'checkbox' ? (e.target.checked ? 'true' : 'false') : (e.target.value || '');");
1000-
w.write(" push_event_dom_CHANGE(parseInt(el.dataset.g), val); _triggerDiscreteUpdate(); return;");
1005+
w.write(" push_event_dom_CHANGE(parseInt(el.dataset.g), val); pushed = true;");
10011006
w.write(" }");
10021007
w.write(" el = el.parentElement;");
10031008
w.write(" }");
1009+
w.write(" if (pushed) _triggerDiscreteUpdate();");
10041010
w.write("});");
10051011
}
10061012

10071013
if (used_event_listeners.count("keydown"))
10081014
{
10091015
w.write("");
1010-
w.write("// Global keydown event delegation - walks up DOM tree to find handler");
1016+
w.write("// Global keydown delegation with bubbling semantics (target -> ancestors)");
10111017
w.write("document.body.addEventListener('keydown', (e) => {");
10121018
w.write(" let el = e.target;");
1019+
w.write(" let pushed = false;");
10131020
w.write(" while (el && el !== document.body) {");
1014-
w.write(" if (el.dataset.k) { push_event_dom_KEYDOWN(parseInt(el.dataset.k), e.keyCode); _triggerDiscreteUpdate(); return; }");
1021+
w.write(" if (el.dataset.k) { push_event_dom_KEYDOWN(parseInt(el.dataset.k), e.keyCode); pushed = true; }");
10151022
w.write(" el = el.parentElement;");
10161023
w.write(" }");
1024+
w.write(" if (pushed) _triggerDiscreteUpdate();");
10171025
w.write("});");
10181026
}
10191027

0 commit comments

Comments
 (0)