История изменений
Исправление 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, если есть несохранённые данные).