Skip to content

Commit 070b056

Browse files
committed
fix: allow events to continue propagating following an error
1 parent b91a67b commit 070b056

File tree

2 files changed

+37
-24
lines changed

2 files changed

+37
-24
lines changed

.changeset/light-penguins-invent.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'svelte': patch
3+
---
4+
5+
fix: allow events to continue propagating following an error

packages/svelte/src/internal/client/dom/elements/events.js

Lines changed: 32 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -122,36 +122,44 @@ export function handle_event_propagation(handler_element, event) {
122122
}
123123
});
124124

125-
while (current_target !== null) {
125+
/** @param {Element} current_target */
126+
function next(current_target) {
126127
/** @type {null | Element} */
127128
var parent_element =
128129
current_target.parentNode || /** @type {any} */ (current_target).host || null;
129-
var internal_prop_name = '__' + event_name;
130-
// @ts-ignore
131-
var delegated = current_target[internal_prop_name];
132-
133-
if (delegated !== undefined && !(/** @type {any} */ (current_target).disabled)) {
134-
if (is_array(delegated)) {
135-
var [fn, ...data] = delegated;
136-
fn.apply(current_target, [event, ...data]);
137-
} else {
138-
delegated.call(current_target, event);
130+
131+
try {
132+
// @ts-expect-error
133+
var delegated = current_target['__' + event_name];
134+
135+
if (delegated !== undefined && !(/** @type {any} */ (current_target).disabled)) {
136+
if (is_array(delegated)) {
137+
var [fn, ...data] = delegated;
138+
fn.apply(current_target, [event, ...data]);
139+
} else {
140+
delegated.call(current_target, event);
141+
}
142+
}
143+
} finally {
144+
if (
145+
event.cancelBubble ||
146+
parent_element === handler_element ||
147+
parent_element === null ||
148+
current_target === handler_element
149+
) {
150+
return;
139151
}
140-
}
141152

142-
if (
143-
event.cancelBubble ||
144-
parent_element === handler_element ||
145-
current_target === handler_element
146-
) {
147-
break;
153+
next(parent_element);
148154
}
149-
150-
current_target = parent_element;
151155
}
152156

153-
// @ts-expect-error is used above
154-
event.__root = handler_element;
155-
// @ts-expect-error is used above
156-
current_target = handler_element;
157+
try {
158+
next(current_target);
159+
} finally {
160+
// @ts-expect-error is used above
161+
event.__root = handler_element;
162+
// @ts-expect-error is used above
163+
current_target = handler_element;
164+
}
157165
}

0 commit comments

Comments
 (0)