Можем ли мы обрабатывать событие закрытия браузера вместо «beforeunload»? [Дубликат]

Вместо bar используйте self.bar или Foo.bar. Присвоение Foo.bar создаст статическую переменную, а присвоение self.bar создаст переменную экземпляра.

46
задан Thomas 2 June 2015 в 17:55
поделиться

10 ответов

Вы пробовали этот код?

window.onbeforeunload = function (event) {
    var message = 'Important: Please click on \'Save\' button to leave this page.';
    if (typeof event == 'undefined') {
        event = window.event;
    }
    if (event) {
        event.returnValue = message;
    }
    return message;
};

$(function () {
    $("a").not('#lnkLogOut').click(function () {
        window.onbeforeunload = null;
    });
    $(".btn").click(function () {
        window.onbeforeunload = null;
});
});

Вторая функция является необязательной, чтобы избежать запроса при нажатии на элементы #lnkLogOut и .btn.

Еще одна вещь, Пользовательская подсказка не будет работать в Firefox (даже в последней версии). Для получения дополнительной информации об этом перейдите в этот поток .

52
ответ дан Community 22 August 2018 в 17:41
поделиться
  • 1
    да, я тоже это пробовал – vjeta 31 December 2013 в 11:27
  • 2
    вы видели ошибки в консоли? – Ravimallya 31 December 2013 в 13:06
  • 3
    Код @Ravi в порядке. Но я хочу запустить функцию выхода из системы, если пользователь нажимает кнопку «Оставить эту страницу». Но как я могу определить, нажал ли пользователь «Оставить эту страницу»? или нет? – Bit_hunter 1 August 2015 в 12:40
  • 4
    Я не уверен, возможно ли это или нет. Насколько я знаю, это невозможно. Однако можете ли вы опубликовать новый вопрос со ссылкой на этот ответ, чтобы какое сообщество скажет. – Ravimallya 3 August 2015 в 04:37
  • 5
    @Bit_hunter, вы можете выполнить функцию, в которой вы показываете пользовательский div, где пользователь может нажать Да или Нет – Black 12 April 2016 в 07:11

Обращаясь к различным статьям и выполняя некоторые пробные и пробные проверки, я, наконец, разработал эту идею, которая отлично работает для меня.

Идея заключалась в обнаружении события разгрузки, которое запускается при закрытии браузера. В этом случае мышь выйдет из окна, указывая на кнопку закрытия («X»).

$(window).on('mouseover', (function () {
    window.onbeforeunload = null;
}));
$(window).on('mouseout', (function () {
    window.onbeforeunload = ConfirmLeave;
}));
function ConfirmLeave() {
    return "";
}
var prevKey="";
$(document).keydown(function (e) {            
    if (e.key=="F5") {
        window.onbeforeunload = ConfirmLeave;
    }
    else if (e.key.toUpperCase() == "W" && prevKey == "CONTROL") {                
        window.onbeforeunload = ConfirmLeave;   
    }
    else if (e.key.toUpperCase() == "R" && prevKey == "CONTROL") {
        window.onbeforeunload = ConfirmLeave;
    }
    else if (e.key.toUpperCase() == "F4" && (prevKey == "ALT" || prevKey == "CONTROL")) {
        window.onbeforeunload = ConfirmLeave;
    }
    prevKey = e.key.toUpperCase();
});

Функция ConfirmLeave выдаст всплывающее сообщение по умолчанию, если есть любой необходимости настроить сообщение, а затем вернуть текст, который будет отображаться вместо пустой строки в функции ConfirmLeave () .

32
ответ дан Homer 22 August 2018 в 17:41
поделиться
  • 1
    как насчет стрельбы ajax, когда пользователь нажимает кнопку «оставить страницу», возможно ли это? если не то, что может быть альтернативой этому – Aitazaz Khan 27 November 2015 в 15:49
  • 2
    Мой любимый ответ. Это позволяет избежать перечисления всех возможных элементов DOM, которые могут привести вас к странице. И кроме того, код также обнаруживает закрытие клавиш закрытия вкладки \ окна. – GigiSan 4 February 2016 в 16:10
  • 3
    я получаю Cannot read property 'toUpperCase' of undefined – Black 12 April 2016 в 07:01
  • 4
    Привет, Шив. В большинстве случаев это работает нормально, за исключением ALT + F4, когда нет другой вкладки, то есть откройте страницу в браузере и нажмите Alt + F4. Это закрывает браузер без сообщения. Ctrl + F4 работает в той же ситуации. Любая идея? – Milind Thakkar 1 August 2016 в 18:21
  • 5
    Кроме того, он запускается, если вы нажмете кнопку «Назад» или «Вперед», когда мышь находится вне окна для этих кнопок. :-( – Milind Thakkar 2 August 2016 в 06:12

Попробуйте выполнить следующий код для меня в среде Linux chrome. Перед запуском убедитесь, что jquery прикреплен к документу.

$(document).ready(function()
{
    $(window).bind("beforeunload", function() { 
        return confirm("Do you really want to close?"); 
    });
});

Для простого выполните следующие шаги:

  1. открыть http://jsfiddle.net/
  2. введите что-то в html, css или javascript box
  3. попытайтесь закрыть вкладку в chrome

Он должен показать следующее изображение:

enter image description here [/g1]

10
ответ дан Khamidulla 22 August 2018 в 17:41
поделиться
  • 1
    Не работает в Firefox v33 – Rahul Desai 28 October 2014 в 10:58
  • 2
    Извините, В ubuntu у меня нет Mozilla 33. Таким образом, вы можете искать реализацию jsfiddle – Khamidulla 28 October 2014 в 11:10
  • 3
    Fiddle url больше не работает. Проверьте и обновите – Shashank Vivek 22 January 2017 в 09:51
  • 4
    @ShashankVivek скрипка ссылка работает. Прочитайте ответ еще раз. Они удалили "beforeunload" обработка событий из текущей версии web ui. Таким образом, вы больше не увидите окно уведомлений в jsfiddle. Однако, используя верхний скрипт, вы все равно можете обрабатывать событие самостоятельно. Я ничего не могу сделать. – Khamidulla 23 January 2017 в 09:54
  • 5
    Заблокировано подтверждение («Вы действительно хотите закрыть?») Во время предварительной загрузки. – Amin Rahimi 9 July 2018 в 12:41

Как сказал Феникс, используйте метод jQuery .bind, но для большей совместимости с браузером вы должны вернуть String,

$(document).ready(function()
{
    $(window).bind("beforeunload", function() { 
        return "Do you really want to close?"; 
    });
});

более подробную информацию можно найти по адресу: developer.mozilla.org

3
ответ дан Macondo 22 August 2018 в 17:41
поделиться

Возможно, лучше использовать мышь с обнаружением пути.

В BrowserClosureNotice у вас есть демонстрационный пример и чистая библиотека javascript для этого.

It не является совершенным, но избегает проблем с документами или событиями мыши ...

0
ответ дан manufosela 22 August 2018 в 17:41
поделиться
  • 1
    Что делать, если пользователь просто наводит курсор на кнопку закрытия, но не нажимает? И как справиться с ситуацией в мобильных браузерах? – Black 12 April 2016 в 07:18
  • 2
    Этот код обнаруживает, когда мышь идет к кнопке закрытия, но не обнаруживает, когда нажата кнопка закрытия. Если вы хотите, вы также можете добавить это событие. В моем случае я не хочу избегать закрытия, я хочу показать информацию, если я думаю, что вы думаете закрыть страницу. – manufosela 13 April 2016 в 09:42
  • 3
    Но это все равно не будет работать на мобильных браузерах, поэтому решение не будет желтым из яйца. – Black 14 April 2016 в 06:27
  • 4
    Конечно, этот подход не является решением для мобильных браузеров – manufosela 15 April 2016 в 11:42

Следующий сценарий даст сообщение в Chrome и IE:

<script>
window.onbeforeunload = function (e) {
// Your logic to prepare for 'Stay on this Page' goes here 

    return "Please click 'Stay on this Page' and we will give you candy";
};
</script>

Chrome enter image description here [/g0]

IE enter image description here [/g1]

в Firefox вы получите общее сообщение

enter image description here [/g2]

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

Ответ на вопрос в комментарии

F5 снова запустит событие, так что Atl + F4.

3
ответ дан Matas Vaitkevicius 22 August 2018 в 17:41
поделиться
  • 1
    Я бы хотел обнаружить только тогда, когда пользователь закрывает вкладку или навигатор и Alt + F4. – Kiquenet 8 July 2015 в 10:31
  • 2
    @Kiquenet Я только что протестировал Alt + f4 на IE8, и это действительно вызвало механизм, я, должно быть, сделал что-то не так, когда тестировал Crome, который он запускает во всех браузерах (IE, Chrome, Firefox) – Matas Vaitkevicius 8 July 2015 в 10:33
  • 3
    как насчет стрельбы ajax, когда пользователь нажимает кнопку «оставить страницу», возможно ли это? если не то, что может быть альтернативой этому – Aitazaz Khan 27 November 2015 в 15:20
  • 4
    Есть ли способ избежать сообщения, когда страница обновляется? – oracleruiz 20 June 2016 в 16:31
  • 5
    Я искал, чтобы обнаружить событие закрытия для приложения HTA, это решение отлично работало. – freginold 17 November 2016 в 16:08
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />


<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js"></script>

<script type="text/javascript" language="javascript">

var validNavigation = false;

function endSession() {
// Browser or broswer tab is closed
// Do sth here ...
alert("bye");
}

function wireUpEvents() {
/*
* For a list of events that triggers onbeforeunload on IE
* check http://msdn.microsoft.com/en-us/library/ms536907(VS.85).aspx
*/
window.onbeforeunload = function() {
  if (!validNavigation) {

            var ref="load";
      $.ajax({
            type: 'get',
            async: false,
            url: 'logout.php',
 data:
            {
                ref:ref               
            },
             success:function(data)
            {
                console.log(data);
            }
            });
     endSession();
  }
 }

// Attach the event keypress to exclude the F5 refresh
$(document).bind('keypress', function(e) {
if (e.keyCode == 116){
  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();  
}); 
</script> 

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

0
ответ дан ramesh kanna 22 August 2018 в 17:41
поделиться
  • 1
    пожалуйста, поделитесь некоторым объяснением, почему это работает и как оно работает – Tomaž Bratanič 31 March 2017 в 09:20
  • 2
    Это используется, когда пользователь вошел в систему, закрыв вкладку браузера или браузера, он автоматически выйдет из учетной записи пользователя. И внесите изменения в базу данных также ..... – ramesh kanna 31 March 2017 в 09:32

Вы можете попробовать что-то вроде этого.

<html>
<head>
    <title>test</title>
    <script>
        function openChecking(){
            // alert("open");
            var width = Number(screen.width-(screen.width*0.25));  
            var height = Number(screen.height-(screen.height*0.25));
            var leftscr = Number((screen.width/2)-(width/2)); // center the window
            var topscr = Number((screen.height/2)-(height/2));
            var url = "";
            var title = 'popup';
            var properties = 'width='+width+', height='+height+', top='+topscr+', left='+leftscr;
            var popup = window.open(url, title, properties);
            var crono = window.setInterval(function() {
                if (popup.closed !== false) { // !== opera compatibility reasons
                    window.clearInterval(crono);
                    checkClosed();
                }
            }, 250); //we check if the window is closed every 1/4 second
        }   
        function checkClosed(){
            alert("closed!!");
            // do something
        }
    </script>    
</head>
<body>
    <button onclick="openChecking()">Click Me</button>
</body>
</html>

Когда пользователь закрывает окно, обратный вызов будет запущен.

-3
ответ дан Salvador P. 22 August 2018 в 17:41
поделиться
<script type="text/javascript">
window.addEventListener("beforeunload", function (e) {

  var confirmationMessage = "Are you sure you want to leave this page without placing the order ?";
  (e || window.event).returnValue = confirmationMessage;
  return confirmationMessage;

});
</script>

Пожалуйста, попробуйте этот код, это отлично работает для меня. Это настраиваемое сообщение поступает в браузер Chrome, но в Mozilla это сообщение не отображается.

0
ответ дан user2753425 22 August 2018 в 17:41
поделиться

Привет, у меня есть сложное решение, которое работает только в новых браузерах:

просто откройте веб-сайт на вашем сервере, когда пользователь закроет окно, событие onclose будет запущено

3
ответ дан wutzebaer 22 August 2018 в 17:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: