Правильный способ сделать это - использовать прослушиватель событий для захвата объекта события и затем предотвратить действие по умолчанию, которое должно быть оставлено.
window.addEventListener('beforeunload',
function(e)
{
if (!confirm('Are you sure that you want to leave?'))
e.preventDefault();
}, 1);
Хотя его реализация может отличаться в разных браузерах.В моем Fiefox 6 он снова просит подтвердить один раз e.preventDefault ();инструкция достигнута, в качестве меры безопасности, осуществляемой Mozilla. 1 августа:
Сегодня я попробовал, и в браузере Chromium, если вы запретите действие по умолчанию, не запрашивая у пользователя подтверждения, например, с помощью поля подтверждения, страница все равно закроется.
Сегодня я провел некоторое исследование по этому поводу и обнаружил, что, по-видимому, невозможно инициировать событие закрытия страницы из Javascript, поэтому использование настраиваемого поля подтверждения «HTML» для этого не будет возможным.Я пытался создавать собственные события, отправлять их различным элементам окна и даже проверять и копировать события, созданные браузером.(Все это в Firefox, в Chromium я не проверял, потому что отсутствие поддержки в Firefox означает, что никогда не полагаться на что-то подобное)
Но хорошие новости для вас , у меня естьобнаружил, что если вы быстро настроите запрос XMLHttpRequest и отправите информацию, которую хотите сохранить, перед отправкой, отправка данных будет завершена в фоновом режиме, даже если страница была закрыта.
Я успешно смог добиться этого зав обоих браузерах со следующим кодом.
window.addEventListener('beforeunload',
function(e)
{
var fd = new FormData();
fd.append('html', document.body.innerHTML);
var xhr = new XMLHttpRequest;
xhr.open('POST', './dataRetriever.php');
xhr.send(fd);
// uncomment these if you want confirmation for all browsers
// because this code will not ask for confirmation in others
// than Mozilla powered ones.
//if (!confirm('Leave?'))
// e.preventDefault();
}
, 1);
С этим я отправляю все тело innerHTML в мой скрипт dataRetriever.php, поэтому скажите мне, как он работает и работает ли он для вас, как ожидалось.