Итак ... как получить действие пользователя?
Вы на самом деле не можете, напрямую. Браузер отвечает за показ подтверждения и за продолжение навигации, если все в порядке, или бездействие, если Отмена. Вы не можете узнать, нажал ли пользователь OK, пока вы не получите окончательный unload
, к этому моменту уже слишком поздно.
Одна из стратегий состоит в том, чтобы предположить, что, если пользователь все еще остается на странице через некоторое время после beforeunload
, он, вероятно, нажал кнопку Отмена:
var redirecting= false;
window.onbeforeunload = function() {
if (redirecting) return;
setTimeout(function() {
setTimeout(function() {
redirecting= true;
location.href= 'http://www.example.com/';
}, 2000);
}, 0);
return 'Boo hoo, please stay with me';
};
(Флаг redirecting
должен останавливать нашу собственную навигацию, также вызывая предупреждение beforeunload
; двойной тайм-аут должен гарантировать, что тайм-аут происходит через одну секунду после закрытия окна подтверждения, а не через секунду после его открыт.)
К сожалению, это все еще крайне ненадежно, так как оно выполнит перенаправление, даже если пользователь нажмет ОК, но страница, на которую они переходят, занимает более двух секунд, чтобы начать загрузку.
Другим способом было бы всегда ничего не возвращать из приглашения beforeunload
, а затем установить собственный явный confirm()
в 0-тайм-аут. Но это ненадежный кросс-браузер, так как по понятным причинам браузеры не хотят, чтобы страницы делали потенциально неприятные вещи, подобные этой. Он вроде работает в IE и почти работает в Firefox, если вы нарушаете кеш назад / вперед (поскольку это скрывает страницу до того, как произойдет подтверждение).
В общем, не очень хорошее решение. Какой вариант использования для перенаправления пользователя? Возможно, вы могли бы попытаться заменить содержимое текущей страницы, а не делать перенаправление?