Skip to content

Commit 7e462ee

Browse files
authored
chore: use unbound event listeners (#12165)
1 parent 752f872 commit 7e462ee

File tree

2 files changed

+13
-26
lines changed

2 files changed

+13
-26
lines changed

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ export function create_event(event_name, dom, handler, options) {
4444
function target_handler(/** @type {Event} */ event) {
4545
if (!options.capture) {
4646
// Only call in the bubble phase, else delegated events would be called before the capturing events
47-
handle_event_propagation(dom, event);
47+
handle_event_propagation.call(dom, event);
4848
}
4949
if (!event.cancelBubble) {
5050
return handler.call(this, event);
@@ -143,11 +143,12 @@ export function delegate(events) {
143143
}
144144

145145
/**
146-
* @param {EventTarget} handler_element
146+
* @this {EventTarget}
147147
* @param {Event} event
148148
* @returns {void}
149149
*/
150-
export function handle_event_propagation(handler_element, event) {
150+
export function handle_event_propagation(event) {
151+
var handler_element = this;
151152
var owner_document = /** @type {Node} */ (handler_element).ownerDocument;
152153
var event_name = event.type;
153154
var path = event.composedPath?.() || [];

packages/svelte/src/internal/client/render.js

Lines changed: 9 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -196,38 +196,23 @@ function _mount(Component, { target, anchor, props = {}, events, context, intro
196196

197197
const registered_events = new Set();
198198

199-
const bound_event_listener = handle_event_propagation.bind(null, target);
200-
const bound_document_event_listener = handle_event_propagation.bind(null, document);
201-
202199
/** @param {Array<string>} events */
203200
const event_handle = (events) => {
204201
for (let i = 0; i < events.length; i++) {
205202
const event_name = events[i];
203+
const passive = PassiveDelegatedEvents.includes(event_name);
204+
206205
if (!registered_events.has(event_name)) {
207206
registered_events.add(event_name);
207+
208208
// Add the event listener to both the container and the document.
209209
// The container listener ensures we catch events from within in case
210210
// the outer content stops propagation of the event.
211-
target.addEventListener(
212-
event_name,
213-
bound_event_listener,
214-
PassiveDelegatedEvents.includes(event_name)
215-
? {
216-
passive: true
217-
}
218-
: undefined
219-
);
211+
target.addEventListener(event_name, handle_event_propagation, { passive });
212+
220213
// The document listener ensures we catch events that originate from elements that were
221214
// manually moved outside of the container (e.g. via manual portals).
222-
document.addEventListener(
223-
event_name,
224-
bound_document_event_listener,
225-
PassiveDelegatedEvents.includes(event_name)
226-
? {
227-
passive: true
228-
}
229-
: undefined
230-
);
215+
document.addEventListener(event_name, handle_event_propagation, { passive });
231216
}
232217
}
233218
};
@@ -264,9 +249,10 @@ function _mount(Component, { target, anchor, props = {}, events, context, intro
264249

265250
return () => {
266251
for (const event_name of registered_events) {
267-
target.removeEventListener(event_name, bound_event_listener);
268-
document.removeEventListener(event_name, bound_document_event_listener);
252+
target.removeEventListener(event_name, handle_event_propagation);
253+
document.removeEventListener(event_name, handle_event_propagation);
269254
}
255+
270256
root_event_handles.delete(event_handle);
271257
mounted_components.delete(component);
272258
};

0 commit comments

Comments
 (0)