chore: unify bindings to use internal event system

pull/15240/head
Dominic Gannaway 7 months ago
parent c4d4349d0a
commit 2e1a0aca39

@ -0,0 +1,5 @@
---
'svelte': patch
---
chore: unify bindings to use internal event system

@ -1,6 +1,7 @@
import { hydrating } from '../../hydration.js'; import { hydrating } from '../../hydration.js';
import { render_effect, effect, teardown } from '../../../reactivity/effects.js'; import { render_effect, effect, teardown } from '../../../reactivity/effects.js';
import { listen } from './shared.js'; import { listen } from './shared.js';
import { on } from '../events.js';
/** @param {TimeRanges} ranges */ /** @param {TimeRanges} ranges */
function time_ranges_to_array(ranges) { function time_ranges_to_array(ranges) {
@ -42,7 +43,7 @@ export function bind_current_time(media, get, set = get) {
}; };
raf_id = requestAnimationFrame(callback); raf_id = requestAnimationFrame(callback);
media.addEventListener('timeupdate', callback); var destroy = on(media, 'timeupdate', callback);
render_effect(() => { render_effect(() => {
var next_value = Number(get()); var next_value = Number(get());
@ -54,7 +55,7 @@ export function bind_current_time(media, get, set = get) {
teardown(() => { teardown(() => {
cancelAnimationFrame(raf_id); cancelAnimationFrame(raf_id);
media.removeEventListener('timeupdate', callback); destroy();
}); });
} }

@ -1,3 +1,4 @@
import { run_all } from '../../../../shared/utils.js';
import { teardown } from '../../../reactivity/effects.js'; import { teardown } from '../../../reactivity/effects.js';
import { import {
active_effect, active_effect,
@ -5,6 +6,7 @@ import {
set_active_effect, set_active_effect,
set_active_reaction set_active_reaction
} from '../../../runtime.js'; } from '../../../runtime.js';
import { on } from '../events.js';
import { add_form_reset_listener } from '../misc.js'; import { add_form_reset_listener } from '../misc.js';
/** /**
@ -20,14 +22,15 @@ export function listen(target, events, handler, call_handler_immediately = true)
handler(); handler();
} }
/** @type {(() => void)[]} */
var destroys = [];
for (var name of events) { for (var name of events) {
target.addEventListener(name, handler); destroys.push(on(target, name, handler));
} }
teardown(() => { teardown(() => {
for (var name of events) { run_all(destroys);
target.removeEventListener(name, handler);
}
}); });
} }
@ -57,7 +60,7 @@ export function without_reactive_context(fn) {
* @param {(is_reset?: true) => void} [on_reset] * @param {(is_reset?: true) => void} [on_reset]
*/ */
export function listen_to_event_and_reset_event(element, event, handler, on_reset = handler) { export function listen_to_event_and_reset_event(element, event, handler, on_reset = handler) {
element.addEventListener(event, () => without_reactive_context(handler)); on(element, event, () => handler());
// @ts-expect-error // @ts-expect-error
const prev = element.__on_r; const prev = element.__on_r;
if (prev) { if (prev) {

@ -1,4 +1,5 @@
import { render_effect, teardown } from '../../../reactivity/effects.js'; import { render_effect, teardown } from '../../../reactivity/effects.js';
import { on } from '../events.js';
import { listen } from './shared.js'; import { listen } from './shared.js';
/** /**
@ -9,7 +10,7 @@ import { listen } from './shared.js';
* @returns {void} * @returns {void}
*/ */
export function bind_content_editable(property, element, get, set = get) { export function bind_content_editable(property, element, get, set = get) {
element.addEventListener('input', () => { on(element, 'input', () => {
// @ts-ignore // @ts-ignore
set(element[property]); set(element[property]);
}); });
@ -44,7 +45,7 @@ export function bind_property(property, event_name, element, set, get) {
set(element[property]); set(element[property]);
}; };
element.addEventListener(event_name, handler); on(element, event_name, handler);
if (get) { if (get) {
render_effect(() => { render_effect(() => {

@ -1,5 +1,6 @@
import { effect, render_effect, teardown } from '../../../reactivity/effects.js'; import { effect, render_effect, teardown } from '../../../reactivity/effects.js';
import { listen, without_reactive_context } from './shared.js'; import { on } from '../events.js';
import { listen } from './shared.js';
/** /**
* @param {'x' | 'y'} type * @param {'x' | 'y'} type
@ -10,16 +11,15 @@ import { listen, without_reactive_context } from './shared.js';
export function bind_window_scroll(type, get, set = get) { export function bind_window_scroll(type, get, set = get) {
var is_scrolling_x = type === 'x'; var is_scrolling_x = type === 'x';
var target_handler = () => var target_handler = () => {
without_reactive_context(() => {
scrolling = true; scrolling = true;
clearTimeout(timeout); clearTimeout(timeout);
timeout = setTimeout(clear, 100); // TODO use scrollend event if supported (or when supported everywhere?) timeout = setTimeout(clear, 100); // TODO use scrollend event if supported (or when supported everywhere?)
set(window[is_scrolling_x ? 'scrollX' : 'scrollY']); set(window[is_scrolling_x ? 'scrollX' : 'scrollY']);
}); };
addEventListener('scroll', target_handler, { var destroy = on(window, 'scroll', target_handler, {
passive: true passive: true
}); });
@ -53,7 +53,7 @@ export function bind_window_scroll(type, get, set = get) {
effect(target_handler); effect(target_handler);
teardown(() => { teardown(() => {
removeEventListener('scroll', target_handler); destroy();
}); });
} }
@ -62,5 +62,5 @@ export function bind_window_scroll(type, get, set = get) {
* @param {(size: number) => void} set * @param {(size: number) => void} set
*/ */
export function bind_window_size(type, set) { export function bind_window_size(type, set) {
listen(window, ['resize'], () => without_reactive_context(() => set(window[type]))); listen(window, ['resize'], () => set(window[type]));
} }

@ -1,6 +1,7 @@
import { hydrating } from '../hydration.js'; import { hydrating } from '../hydration.js';
import { clear_text_content, get_first_child } from '../operations.js'; import { clear_text_content, get_first_child } from '../operations.js';
import { queue_micro_task } from '../task.js'; import { queue_micro_task } from '../task.js';
import { on } from './events.js';
/** /**
* @param {HTMLElement} dom * @param {HTMLElement} dom
@ -37,7 +38,8 @@ let listening_to_form_reset = false;
export function add_form_reset_listener() { export function add_form_reset_listener() {
if (!listening_to_form_reset) { if (!listening_to_form_reset) {
listening_to_form_reset = true; listening_to_form_reset = true;
document.addEventListener( on(
document,
'reset', 'reset',
(evt) => { (evt) => {
// Needs to happen one tick later or else the dom properties of the form // Needs to happen one tick later or else the dom properties of the form

Loading…
Cancel
Save