Есть ли в SvelteKit способ отменить событие popstate, если пользовательское состояние не сохранено?

У меня есть компонент, который позволяет пользователю редактировать свое состояние. Это запускает переменную notSaved. У меня есть обработчик событий beforeunload для обработки перезагрузки и выхода со страницы, чтобы напомнить пользователю о сохранении своего состояния, но с помощью SvelteKit использование кнопки «Назад» в браузере, похоже, не вызывает событие beforeunload. У меня также есть обработчик события popstate, потому что он срабатывает при нажатии кнопки «Назад», но я не могу понять, как предотвратить изменение window.history, если переменная notSaved имеет значение true.

Есть ли в SvelteKit способ вызвать всплывающее окно Changes you made may not be saved., подобное тому, которое запускается при событии beforeunload при нажатии кнопки «назад» или «вперед»?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
31
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать функцию beforeNavigate, чтобы получить уведомление о намерении навигации, чтобы потенциально заблокировать его, например:

<script>
    import { beforeNavigate } from '$app/navigation';

    let unsavedWork = false;
    let value = 0;

    beforeNavigate(({ from, to, cancel }) => {
        if (unsaved) {
            cancel();
            showUnsavedWorkPopup();
        }
    });

    function onChange() {
        ...
        unsavedWork = true;
    }

    async function save() {
        await ...
        unsavedWork = false;
    }
</script>

<input type = "number" bind:value on:change = {onChange}>

beforeNavigate/afterNavigate был добавлен в версию 227. Если вы получаете сообщение об ошибке, связанное с отсутствием функции beforeNavigate, проверьте свою версию и убедитесь, что вы не используете более старую версию SvelteKit.

Steven Bell 15.05.2022 05:40

Другие вопросы по теме