LINUX.ORG.RU

История изменений

Исправление KivApple, (текущая версия) :

Нашёл решение: Navigation API.

Что-то вроде:

window.navigation.addEventListener("navigate", evt => {
    if (evt.userInitiated) {
        // Опционально: если не хотим ловить программную
        // навигацию через History API.
        return;
    }
    if (evt.cancelable) {
        if (hasUnsavedChanges()) {
            if (!confirm(
                "Are you sure that you want to leave current page? " +
                "You might lose unsaved data."
            )) {
                evt.preventDefault();
                return;
            }
        }
    } else {
        // Скорее всего сможем поймать через "beforeunload"
    }
    if (evt.canIntercept) {
        // Можно также использовать evt.intercept() вместо того,
        // чтобы самому обрабатывать клики по ссылкам и события
        // "popstate", чтобы загружать и рендерить контент
        // без перезагрузки целой страницы.
        // Пример: https://developer.mozilla.org/en-US/docs/Web/API/NavigateEvent/intercept#examples
    }
});

window.addEventListener("beforeunload", evt => {
    if (hasUnsavedChanges()) {
        evt.returnValue = true;
    }
});

На текущий момент поддерживается в Chromium-based браузерах (Google Chrome, Opera, Edge и т. п.) и не поддерживается в Firefox и Safari. В них судя по всему сейчас обрататывать переходы по истории нельзя, только закрытие страницы совсем, ну и клики по ссылкам (спрашивать прежде чем делать pushState, если есть несохранённые данные).

Исходная версия KivApple, :

Нашёл решение: Navigation API.

Что-то вроде:

window.navigation.addEventListener("navigate", evt => {
    if (evt.userInitiated) {
        // Опционально: если не хотим ловить программную
        // навигацию через History API.
        return;
    }
    if (evt.cancelable) {
        if (hasUnsavedChanges()) {
            if (!confirm(
                "Are you sure that you want to leave current page? " +
                "You might lose unsaved data."
            )) {
                evt.preventDefault();
                return;
            }
        }
    } else {
        // Скорее всего сможем поймать через "beforeunload"
    }
    if (evt.canIntercept) {
        // Можно также использовать evt.intercept() вместо того,
        // чтобы самому обрабатывать клики по ссылкам и события
        // "popstate", чтобы загружать и рендерить контент
        // без перезагрузки.
        // Пример: https://developer.mozilla.org/en-US/docs/Web/API/NavigateEvent/intercept#examples
    }
});

window.addEventListener("beforeunload", evt => {
    if (hasUnsavedChanges()) {
        evt.returnValue = true;
    }
});

На текущий момент поддерживается в Chromium-based браузерах (Google Chrome, Opera, Edge и т. п.) и не поддерживается в Firefox и Safari. В них судя по всему сейчас обрататывать переходы по истории нельзя, только закрытие страницы совсем, ну и клики по ссылкам (спрашивать прежде чем делать pushState, если есть несохранённые данные).