Подтвердить что ты не робот

Настройка onbeforeunload на элемент body в Chrome и IE с помощью jQuery

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

Я использую следующий код. В FireFox я могу посмотреть источник страницы через FireBug, и в теге правильно добавлен атрибут onbeforeunload.

В Chrome и FireFox этого не происходит, и я могу свободно перемещаться от страницы без каких-либо предупреждений. Строка jQuery для обновления тега body, безусловно, выполняется, она просто не выполняет его.

if ($("body").attr('onbeforeunload') == null) {
    if (window.event) {
        // IE and Chrome use this
        $("body").attr('onbeforeunload', 'CatchLeavePage(event)');
    }
    else {
        // Firefox uses this
        $("body").attr('onbeforeunload', 'return false;CatchLeavePage(event)');
    }
}

Любые идеи, как исходить отсюда?

4b9b3361

Ответ 1

вы не можете прервать выгрузку страницы, вернув false. вы должны вернуть строку, которая будет отображаться пользователю в окне сообщения, и он решает, хочет ли он уйти или остаться на странице (выбрав кнопку "ОК" или "Отмена" ), поэтому вам нужно написать свой код, как это:

 window.onbeforeunload = function() {
    return "Are you sure you want to leave this page bla bla bla?"; // you can make this dynamic, ofcourse...
 };

Ответ 2

попробуйте это

  <script type=\"text/javascript\">
        var dont_confirm_leave = 0; //set dont_confirm_leave to 1 when you want the user to be able to leave withou confirmation
        var leave_message = 'You sure you want to leave?'
        function goodbye(e) 
        {
            if(dont_confirm_leave!==1)
            {
                if(!e) e = window.event;
                //e.cancelBubble is supported by IE - this will kill the bubbling process.
                e.cancelBubble = true;
                e.returnValue = leave_message;
                //e.stopPropagation works in Firefox.
                if (e.stopPropagation) 
                {
                    e.stopPropagation();
                    e.preventDefault();
                }

                //return works for Chrome and Safari
                return leave_message;
            }
        }   
    window.onbeforeunload=goodbye;
    </script>

Ответ 3

window.onbeforeunload = function () { return 'Are you sure?' };

Ответ 4

Проверьте этот код:

var validNavigation = false;

function wireUpEvents() {
var dont_confirm_leave = 0; 
var leave_message = "You sure you want to leave ?";

function goodbye(e) {
if (!validNavigation) {
if (dont_confirm_leave !== 1) {
if (!e) e = window.event;
e.cancelBubble = true;
e.returnValue = leave_message;
//e.stopPropagation works in Firefox.
if (e.stopPropagation) {
e.stopPropagation();
e.preventDefault();
}
//return works for Chrome and Safari
return leave_message;
}
}
}

window.onbeforeunload = goodbye;

document.onkeydown = function () {
switch (event.keyCode || e.which) {
case 116 : //F5 button
validNavigation = true;
case 114 : //F5 button
validNavigation = true;
case 82 : //R button
if (event.ctrlKey) {
validNavigation = true;
}
case 13 : //Press enter
validNavigation = true;
}

}
// Attach the event click for all links in the page
$("a").bind("click", function () {
validNavigation = true;
});

// Attach the event submit for all forms in the page
$("form").bind("submit", function () {
validNavigation = true;
});

// Attach the event click for all inputs in the page
$("input[type=submit]").bind("click", function () {
validNavigation = true;
});
}

// Wire up the events as soon as the DOM tree is ready
$(document).ready(function () {
wireUpEvents();
});

Ответ 5

Эти скрипты отлично работают, но что, если я хочу вызвать вызов AJAX, когда пользователь подтвердит закрытие окна?

Я пробовал это, но вызов AJAX запускается, если пользователь нажимает "да", "закрыть" или "нет, оставайтесь здесь" (проверено на Firefox 38.x)

function goodbye(e) {
    if (!validNavigation) {
        if (dont_confirm_leave !== 1) {
            if (!e) e = window.event;
            e.cancelBubble = true;
            e.returnValue = leave_message;
            //e.stopPropagation works in Firefox.
            if (e.stopPropagation) {
                e.stopPropagation();
                e.preventDefault();
            }

            $.ajax({
                async: false,
                url: "/launch-my-script.php"
            });

            //return works for Chrome and Safari
            return leave_message;
        }
    }
}

Ответ 6

Это не очень, но это трюк.

var warnclose = true;
var warn = function(e) {
    var warning = 'Your warning message.';
    if (warnclose) {
        // Disables multiple calls
        warnclose = false;

        // In case we still need warn to be called again 
        setTimeout(function(){
            warnclose = true;
        }, 500);

        return warning;
    }
};
window.onbeforeunload = warn;