En la solution la plus courte pour l'année 2020 (pour les personnes heureuses qui n'ont pas besoin de supporter IE)
Testé dans Chrome, Firefox, Safari.
function onBeforeUnload(e) {
if (thereAreUnsavedChanges()) {
e.preventDefault();
e.returnValue = '';
return;
}
delete e['returnValue'];
}
window.addEventListener('beforeunload', onBeforeUnload);
En fait, aucun navigateur moderne (Chrome, Firefox, Safari) n'affiche la "valeur de retour" sous forme de question à l'utilisateur. Ils affichent plutôt leur propre texte de confirmation (cela dépend du navigateur). Mais nous avons toujours besoin de retourner une chaîne (même vide) pour déclencher cette confirmation sur Chrome.
Plus d'explications sur MDN aquí y aquí .