Javascript: подавить "Эта страница просит вас подтвердить, что вы хотите покинуть" всплывающее окно на bebeforeunload - PullRequest
7 голосов
/ 10 февраля 2012

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

<script type="text/javascript">
$(document).ready(function() {
        window.onbeforeunload = askConfirm;
});

function askConfirm() {
    var addFriend = confirm("Would you like to ping?");
    if (addFriend) {
        var xmlhttp;
        if (window.XMLHttpRequest) {
            xmlhttp=new XMLHttpRequest();
        } else {
            xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
        }
        xmlhttp.open("GET","http://example.com?ping=1234",true);
        xmlhttp.send();
    }
    return null;
}

В зависимости от значения этого последнего оператора return ("", null, true, false или вообще без оператора return) у меня может быть одна из двух ситуаций:

1) Пользователь получает сообщение "Хотите пинговать?" подтверждение (хорошо), пинг отправлен (хорошо), и пользователю предоставляется всплывающее окно «Эта страница просит вас подтвердить, что вы хотите покинуть» (BAD) .

-или-

2) Пользователь получает "Хотите пинговать?" подтверждение (хорошо), пинг не отправлено (ПЛОХО) , а пользователю не представлен знак «На этой странице вас просят подтвердить хочу оставить "всплывающее окно" (хорошо).

Как я могу отправить пинг AJAX, но при этом отключить всплывающее окно «Эта страница просит вас подтвердить, что вы хотите покинуть»?

Редактировать: Как бы нелепо это ни звучало, "обходной путь", который я нашел для этой проблемы, заключается в alert() после оператора xmlhttp.send(). Единственный чистый способ сделать это - предупредить пользователя о том, что его пинг отправлен. Если будущие StackOverflowers найдут лучшее решение, я хотел бы знать.

Спасибо.

Ответы [ 2 ]

9 голосов
/ 12 февраля 2012

Вы можете сделать ваш запрос Ajax синхронным.

xmlhttp.open("GET","http://example.com?ping=1234", false); // use false here 
xmlhttp.send(); 

Это может вызвать небольшую задержку, если ваш сервер работает медленно, но это должно решить проблему с пингом, не отправляемым.

2 голосов
/ 18 февраля 2012

Что ж, вместо того, чтобы делать это до того, как вы уйдете, я сделал это на загрузке, и вот что я получил для работы в FF и IE (кроме хрома, это все, что я получил): http://jsfiddle.net/rmpLm/9/.

возможно, вы можетезаставить его работать на Chrome, но если вы не можете, может быть, вы могли бы сделать это так, что если вы нажмете ОК, он приведет вас на страницу, где вы отправите его.надеюсь, это поможет:)

РЕДАКТИРОВАТЬ: может быть, вам следует подумать о том, чтобы сделать это так, чтобы он загружал

...