Окно подтверждения Javascript при выходе - PullRequest
2 голосов
/ 19 октября 2010

У меня странная проблема с настройкой окна подтверждения при выходе пользователя.

Вот код:

    function closeIt() {
    var message = "Click 'Cancel' right now!";

    evt=(typeof evt == 'undefined') ? window.event:evt;
    evt ? evt.returnValue = message:null;
    return message;
    }   
    window.onbeforeunload = closeIt;

Какую функциональность я хотел бы реализовать? Когда пользователь нажимает кнопку Отмена, я хочу перенаправить страницу.

Я использую миллионы идей, ни одна из которых не работала. Есть идеи?

Редактировать Вот что я хотел бы иметь: Пользователи пытаются закрыть его вкладку браузера, я хотел бы отобразить маленькое окно подтверждения, если он нажимает кнопку ОК ->, затем закрывает вкладку, если он нажимает кнопку Отмена -> не закрывать вкладку и перенаправлять пользователя для сохранения страницы.

Я испробовал миллионы методов, столкнулся с множеством проблем.

Ответы [ 5 ]

6 голосов
/ 19 октября 2010

Итак ... как получить действие пользователя?

Вы на самом деле не можете, напрямую. Браузер отвечает за показ подтверждения и за продолжение навигации, если все в порядке, или бездействие, если Отмена. Вы не можете узнать, нажал ли пользователь 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, если вы нарушаете кеш назад / вперед (поскольку это скрывает страницу до того, как произойдет подтверждение).

В общем, не очень хорошее решение. Какой вариант использования для перенаправления пользователя? Возможно, вы могли бы попытаться заменить содержимое текущей страницы, а не делать перенаправление?

1 голос
/ 19 октября 2010

это то, что вы хотите?

<script type="text/javascript">
window.onbeforeunload = function (evt) {
var message = 'Are you sure you want to leave?';
if (typeof evt == 'undefined') {
evt = window.event;
}
if (evt) {
evt.returnValue = message;
window.location = "http://www.google.com/";
}
return message;
}
</script>

Вы можете просто заменить google.com своим URL.я использовал google.com для тестирования :)Ура!

0 голосов
/ 19 октября 2010

Вы пытались запустить событие таймера в обработчике события onbeforeUnload?Они обычно не запускаются, пока на экране есть модальное диалоговое окно, например, подтверждение.(Это может зависеть от платформы!)

Таймер может быть убит автоматически, когда пользователь нажимает ОКЕсли нет, вам нужно остановить его в onunload.

Если таймер отключился, вы перенаправили страницу в обработчик событий таймера.

0 голосов
/ 19 октября 2010

Я работаю с такой же проблемой (с Dojo v1.3) (см. http://jsfiddle.net/ZPxtj/19/).

Похоже:


window.onbeforeunload = function() {
    ...
};

Работает хорошо.

0 голосов
/ 19 октября 2010

У меня работает usign confirm.Я искренне не понял, как вы пытались ее решить, учитывая, что confirm не выдается.

window.onbeforeunload = function(){
  return confirm("Click 'Cancel' right now!");
}
...