Skip to content

Commit 2e1a0ac

Browse files
committed
chore: unify bindings to use internal event system
1 parent c4d4349 commit 2e1a0ac

File tree

6 files changed

+33
-21
lines changed

6 files changed

+33
-21
lines changed

.changeset/mighty-icons-sin.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+
chore: unify bindings to use internal event system

packages/svelte/src/internal/client/dom/elements/bindings/media.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { hydrating } from '../../hydration.js';
22
import { render_effect, effect, teardown } from '../../../reactivity/effects.js';
33
import { listen } from './shared.js';
4+
import { on } from '../events.js';
45

56
/** @param {TimeRanges} ranges */
67
function time_ranges_to_array(ranges) {
@@ -42,7 +43,7 @@ export function bind_current_time(media, get, set = get) {
4243
};
4344

4445
raf_id = requestAnimationFrame(callback);
45-
media.addEventListener('timeupdate', callback);
46+
var destroy = on(media, 'timeupdate', callback);
4647

4748
render_effect(() => {
4849
var next_value = Number(get());
@@ -54,7 +55,7 @@ export function bind_current_time(media, get, set = get) {
5455

5556
teardown(() => {
5657
cancelAnimationFrame(raf_id);
57-
media.removeEventListener('timeupdate', callback);
58+
destroy();
5859
});
5960
}
6061

packages/svelte/src/internal/client/dom/elements/bindings/shared.js

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1+
import { run_all } from '../../../../shared/utils.js';
12
import { teardown } from '../../../reactivity/effects.js';
23
import {
34
active_effect,
45
active_reaction,
56
set_active_effect,
67
set_active_reaction
78
} from '../../../runtime.js';
9+
import { on } from '../events.js';
810
import { add_form_reset_listener } from '../misc.js';
911

1012
/**
@@ -20,14 +22,15 @@ export function listen(target, events, handler, call_handler_immediately = true)
2022
handler();
2123
}
2224

25+
/** @type {(() => void)[]} */
26+
var destroys = [];
27+
2328
for (var name of events) {
24-
target.addEventListener(name, handler);
29+
destroys.push(on(target, name, handler));
2530
}
2631

2732
teardown(() => {
28-
for (var name of events) {
29-
target.removeEventListener(name, handler);
30-
}
33+
run_all(destroys);
3134
});
3235
}
3336

@@ -57,7 +60,7 @@ export function without_reactive_context(fn) {
5760
* @param {(is_reset?: true) => void} [on_reset]
5861
*/
5962
export function listen_to_event_and_reset_event(element, event, handler, on_reset = handler) {
60-
element.addEventListener(event, () => without_reactive_context(handler));
63+
on(element, event, () => handler());
6164
// @ts-expect-error
6265
const prev = element.__on_r;
6366
if (prev) {

packages/svelte/src/internal/client/dom/elements/bindings/universal.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { render_effect, teardown } from '../../../reactivity/effects.js';
2+
import { on } from '../events.js';
23
import { listen } from './shared.js';
34

45
/**
@@ -9,7 +10,7 @@ import { listen } from './shared.js';
910
* @returns {void}
1011
*/
1112
export function bind_content_editable(property, element, get, set = get) {
12-
element.addEventListener('input', () => {
13+
on(element, 'input', () => {
1314
// @ts-ignore
1415
set(element[property]);
1516
});
@@ -44,7 +45,7 @@ export function bind_property(property, event_name, element, set, get) {
4445
set(element[property]);
4546
};
4647

47-
element.addEventListener(event_name, handler);
48+
on(element, event_name, handler);
4849

4950
if (get) {
5051
render_effect(() => {

packages/svelte/src/internal/client/dom/elements/bindings/window.js

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { effect, render_effect, teardown } from '../../../reactivity/effects.js';
2-
import { listen, without_reactive_context } from './shared.js';
2+
import { on } from '../events.js';
3+
import { listen } from './shared.js';
34

45
/**
56
* @param {'x' | 'y'} type
@@ -10,16 +11,15 @@ import { listen, without_reactive_context } from './shared.js';
1011
export function bind_window_scroll(type, get, set = get) {
1112
var is_scrolling_x = type === 'x';
1213

13-
var target_handler = () =>
14-
without_reactive_context(() => {
15-
scrolling = true;
16-
clearTimeout(timeout);
17-
timeout = setTimeout(clear, 100); // TODO use scrollend event if supported (or when supported everywhere?)
14+
var target_handler = () => {
15+
scrolling = true;
16+
clearTimeout(timeout);
17+
timeout = setTimeout(clear, 100); // TODO use scrollend event if supported (or when supported everywhere?)
1818

19-
set(window[is_scrolling_x ? 'scrollX' : 'scrollY']);
20-
});
19+
set(window[is_scrolling_x ? 'scrollX' : 'scrollY']);
20+
};
2121

22-
addEventListener('scroll', target_handler, {
22+
var destroy = on(window, 'scroll', target_handler, {
2323
passive: true
2424
});
2525

@@ -53,7 +53,7 @@ export function bind_window_scroll(type, get, set = get) {
5353
effect(target_handler);
5454

5555
teardown(() => {
56-
removeEventListener('scroll', target_handler);
56+
destroy();
5757
});
5858
}
5959

@@ -62,5 +62,5 @@ export function bind_window_scroll(type, get, set = get) {
6262
* @param {(size: number) => void} set
6363
*/
6464
export function bind_window_size(type, set) {
65-
listen(window, ['resize'], () => without_reactive_context(() => set(window[type])));
65+
listen(window, ['resize'], () => set(window[type]));
6666
}

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { hydrating } from '../hydration.js';
22
import { clear_text_content, get_first_child } from '../operations.js';
33
import { queue_micro_task } from '../task.js';
4+
import { on } from './events.js';
45

56
/**
67
* @param {HTMLElement} dom
@@ -37,7 +38,8 @@ let listening_to_form_reset = false;
3738
export function add_form_reset_listener() {
3839
if (!listening_to_form_reset) {
3940
listening_to_form_reset = true;
40-
document.addEventListener(
41+
on(
42+
document,
4143
'reset',
4244
(evt) => {
4345
// Needs to happen one tick later or else the dom properties of the form

0 commit comments

Comments
 (0)