Найкоротша рішення для 2020 року (за винятком тих щасливих людей , які не повинні підтримувати IE)
Перевірено в Chrome, Firefox, Safari.
function onBeforeUnload(e) {
if (thereAreUnsavedChanges()) {
e.preventDefault();
e.returnValue = '';
return;
}
delete e['returnValue'];
}
window.addEventListener('beforeunload', onBeforeUnload);
Насправді жоден сучасний браузер (Chrome, Firefox, Safari) не відображає "повернене значення" як запитання до користувача. Натомість вони показують власний текст підтвердження (це залежить від браузера). Але нам все одно потрібно повернути деякий (навіть порожній) рядок, щоб запустити це підтвердження в Chrome.
Більше пояснень див. На MDN тут і тут .