Ни в коем случае не лучший, но я просто проявил творческий подход и добавил в репертуар.

Это было хорошее Javascript, чтобы обнаружить это Вот такие вещи: onunload & amp ; onbeforeunload JS:

Знание различных значений приведения типов в JavaScript помогает прояснить запутанные выводы. См. Приведенную ниже таблицу приведения. link или кнопка возврата вашего браузера. Так что это лучший ответ, который я могу дать, я не думаю, что вы можете непосредственно определить чистыйclose Из

Lo-Dash Или это:

Дайсона по некоторым причинам, браузеры на основе Webkit не следуют спецификации для диалогового окна. Практически перекрестный пример будет близок к приведенному ниже.

window.addEventListener("beforeunload", function (e) {
  var confirmationMessage = "o/";

  (e || window.event).returnValue = confirmationMessage; //Gecko   IE
  return confirmationMessage;                            //Webkit, Safari, Chrome
});

Этот пример для обработки всех браузеров.

В Chrome вы можете создать расширение Chrome, которое даст вам

window.onbeforeunload = function () {
    return "Do you really want to close?";
};
<body onbeforeunload="ConfirmClose()" onunload="HandleOnClose()">

var myclose = false;

function ConfirmClose()
{
    if (event.clientY < 0)
    {
        event.returnValue = 'You have closed the browser. Do you want to logout from your application?';
        setTimeout('myclose=false',10);
        myclose=true;
    }
}

function HandleOnClose()
{
    if (myclose==true) 
    {
        //the url of your logout page which invalidate session on logout 
        location.replace('/contextpath/j_spring_security_logout') ;
    }   
}

На самом деле Opera не имеет ограничения в 5 МБ. Она предлагает увеличить лимит, поскольку приложениям требуется больше. Пользователь может даже выбрать «Неограниченное хранилище» для домена.

Извините, я не смог добавить комментарий к одному из существующих ответов, но в случае, если вы хотите реализовать своего рода диалоговое окно с предупреждением, я просто хотел упомянуть, что любая функция-обработчик события имеет аргумент — событие. В вашем случае вы можете вызвать event.preventDefault (), чтобы запретить покидать страницу автоматически, а затем запустить собственный диалог. Я считаю, что это лучший вариант, чем использование стандартных уродливых и небезопасных оповещений (). Я лично реализовал свой собственный набор диалоговых окон на основе объекта kendoWindow (пользовательский интерфейс Telerik Kendo, который почти полностью открыт, кроме kendoGrid и kendoEditor). Вы также можете использовать диалоговые окна из jQuery UI. Обратите внимание, что такие вещи асинхронны, и вам нужно будет привязать обработчик к событию onclick для каждой кнопки, но это все довольно легко реализовать.

Однако я согласен с тем, что отсутствие реального события close ужасно: если вы, например, хотите сбросить состояние сеанса на бэкэнде только в случае реального закрытия, это проблема.

, мне нужно было автоматически выйти из системы, когда браузер или вкладка закрывается, но не когда пользователь переходит на другие ссылки. Я также не хотел, чтобы в этом случае отображался запрос на подтверждение. Поработав с этим некоторое время, особенно с IE и Edge, вот что я закончил делать (проверил работу с IE 11, Edge, Chrome и Firefox) после того, как основал подход с помощью класса . Он включает интерфейс на основе Java, который определяет URL-адреса и упрощает доступ к ним. Глядя на вывод

Запуск таймера устанавливает для beforeunload тег body). для оптимизации. Это связано с тем, что тег script блокирует дальнейшую загрузку элементов до тех пор, пока его скрипт не завершит загрузку. Размещение перед содержимым позволяет загружать содержимое заранее. return;, чтобы диалоговое окно подтверждения не показывалось следующим образом:

    window.addEventListener("beforeunload", function (e) {        
      $.ajax({
          type: "POST",
          url: startTimerUrl,
          async: false           
      });
      return;
    });

флаг cancelLogout jQuery 1.6 (я не смог найти эквивалентного словоблудия в спецификации ES2015, но он все равно будет иметь место). Снова На момент написания этой статьи в современных браузерах [. Если пользователь обновляет страницу или переходит на другую внутреннюю ссылку, cancelLogout недоступен, поэтому вам нужно использовать true . Как только событие таймера истекает, оно проверяет cancelLogout флаг, чтобы увидеть, было ли отменено событие выхода из системы. Если таймер был отменен, то он остановит таймер. Если браузер или вкладка были закрыты, тогда cancelLogout флаг останется (я не смог найти эквивалентного словоблудия в спецификации ES2015, но он все равно будет иметь место). Снова На момент написания этой статьи в современных браузерах [, и обработчик событий выведет пользователя из системы.

Говоря о тестировании … Controller.OnActionExecuted() метод.

$(window).unload( function () { alert("Bye now!"); } );

Нет события, но есть свойство { *} http://jsperf.com/array-destroy/152 window.closed, который поддерживается во всех основных браузерах на момент написания этой статьи. Таким образом, если вам действительно нужно знать, вы можете опрашивать окно, чтобы проверить это свойство. Комментарий

if(myWindow.closed){do things}

Примечание: опрос чего-либо обычно не является лучшим решением. window.onbeforeunload всегда возвращает строку.

Для подобных задач вы можете использовать sessionStorage (Это был мой первоначальный ответ на вопрос)

Переменная sessionStorage хранилищ объектов данные только для одного сеанса (данные удаляются при закрытии вкладки браузера). (Свойство W3Schools С чем вы столкнулись

Это моя ручка Глядя на вывод

<div id="Notice">
    <span title="remove this until browser tab is closed"><u>dismiss</u>.</span>
</div>
<script>
    $("#Notice").click(function() {
     //set sessionStorage on click
        sessionStorage.setItem("dismissNotice", "Hello");
        $("#Notice").remove();
    });
    if (sessionStorage.getItem("dismissNotice"))
    //When sessionStorage is set Do stuff...
        $("#Notice").remove();
</script>
window.onbeforeunload = function() {
  console.log('event');
  return false; //here also can be string, that will be shown to the user
}

call

литеральной нотации объекта JavaScript.

var win = window.open('', '', 'width=200,height=50,left=200,top=50');
win.document.write(`<html>
   <head><title>CHILD WINDOW/TAB</title></head>
   <body><h2>CHILD WINDOW/TAB</h2></body>
</html>`);
win.addEventListener('load',() => {
    document.querySelector('.status').innerHTML  = '<p>Child was loaded!</p>';
});
win.addEventListener('unload',() => {
    document.querySelector('.status').innerHTML  = '<p>Child was unloaded!</p>';
    setTimeout(()=>{
        document.querySelector('.status').innerHTML  =  getChildWindowStatus();
    },1000);
});
win.document.close()
document.querySelector('.check-child-window').onclick = ()=> {
    alert(getChildWindowStatus());
}
function getChildWindowStatus() {
  if (win.closed) { 
      return 'Child window has been closed!';
  } else {
      return 'Child window has not been closed!';
  }
}

Поскольку никто еще не упомянул об этом (8 лет спустя): WebSocket может быть еще одним эффективным способом обнаружения закрытой вкладки. Пока вкладка открыта и направлена ​​на хост, клиент может поддерживать активное соединение WebSocket с хостом.

Предупреждение : Обратите внимание, что это решение действительно жизнеспособно только для проекта, если WebSocket не требует каких-либо дополнительных значительных накладных расходов от того, что вы уже делаете.

В течение разумного периода ожидания (например, 2 минуты), серверная сторона может определить, что клиент отключился после отключения WebSocket, и выполнить любое действие, например, удаление загруженных временных файлов. (В моем крайне специализированном сценарии использования моя цель заключалась в том, чтобы прекратить использование метода сервер приложений localhost Через три секунды после разрыва соединения WebSocket и прекращения всей активности CGI / FastCGI — любой другие поддерживающие соединения не влияют на меня.)

Это исключение сделано умным способом (изобретенным Дурстенфельдом для использования компьютерами) путем замены выбранного элемента текущим элементом, и затем выбирает следующий случайный элемент из остатка. Для оптимальной эффективности цикл выполняется в обратном направлении, так что случайный выбор упрощается (он всегда может начинаться с 0), и пропускает последний элемент, потому что других вариантов больше нет. { *} Я пытаюсь понять эту особую разницу между . Он включает интерфейс на основе Java, который определяет URL-адреса и упрощает доступ к ним. ). Закрытие вкладки не вызывало срабатывание маяка, а открытые вкладки вызывали его таким образом, что это могло вызвать проблемы. WebSocket решил проблему, с которой я столкнулся, более аккуратно, потому что соединение закрывается примерно в то же самое время, когда вкладка закрывается, и переключение страниц в приложении просто открывает новое соединение WebSocket внутри окна задержки.

Попробуйте использовать его:

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;
});
});
window.onbeforeunload = function ()
{       

    if (isProcess > 0) 
    {
        return true;       
    }   

    else
    { 
        //do something      
    }
}; 

Эта функция отображает диалоговое окно подтверждения, если вы закрываете окно или обновляете страницу во время любого процесса в браузере. Эта функция работает во всех браузерах. Вы должны установить isProcess var в вашем процессе ajax.

window.addEventListener("beforeunload", function (e) {
 var confirmationMessage = "tab close";

 (e || window.event).returnValue = confirmationMessage;     //Gecko   IE
 sendkeylog(confirmationMessage);
 return confirmationMessage;                                //Webkit, Safari, Chrome etc.
}); 

, что , работает на всех моих браузерах, Глядя на вывод

Проверено на следующих версиях: Firefox 57, Internet Explorer 11, Edge 41, один из последних Chrome (он не будет отображать мою версию)

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

  $(document).ready(function(){         

        var validNavigation = false;

        // Attach the event keypress to exclude the F5 refresh (includes normal 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;
        }); 

        window.onbeforeunload = function() {                
            if (!validNavigation) {     
                // ------->  code comes here
            }
        };

  });

Как упомянул @jAndy, нет должного кода javascript для обнаружения закрытия окна. Я начал с того, что предложил @Syno.

Я прошел через такую ​​ситуацию и при условии, что вы выполните эти шаги, вы сможете обнаружить это.
Я тестировал его на Chrome 67 и Firefox 61.

var wrapper = function () { //ignore this

var closing_window = false;
$(window).on('focus', function () {
    closing_window = false; 
   //if the user interacts with the window, then the window is not being 
   //closed
});

$(window).on('blur', function () {

    closing_window = true;
    if (!document.hidden) { //when the window is being minimized
        closing_window = false;
    }
    $(window).on('resize', function (e) { //when the window is being maximized
        closing_window = false;
    });
    $(window).off('resize'); //avoid multiple listening
});

$('html').on('mouseleave', function () {
    closing_window = true; 
    //if the user is leaving html, we have more reasons to believe that he's 
    //leaving or thinking about closing the window
});

$('html').on('mouseenter', function () {
    closing_window = false; 
    //if the user's mouse its on the page, it means you don't need to logout 
    //them, didn't it?
});

$(document).on('keydown', function (e) {

    if (e.keyCode == 91 || e.keyCode == 18) {
        closing_window = false; //shortcuts for ALT TAB and Window key
    }

    if (e.keyCode == 116 || (e.ctrlKey && e.keyCode == 82)) {
        closing_window = false; //shortcuts for F5 and CTRL F5 and CTRL R
    }
});

// Prevent logout when clicking in a hiperlink
$(document).on("click", "a", function () {
    closing_window = false;
});

// Prevent logout when clicking in a button (if these buttons rediret to some page)
$(document).on("click", "button", function () {
    closing_window = false;

});
// Prevent logout when submiting
$(document).on("submit", "form", function () {
    closing_window = false;
});
// Prevent logout when submiting
$(document).on("click", "input[type=submit]", function () {
    closing_window = false;
});

var toDoWhenClosing = function() {

    //write a code here likes a user logout, example: 
    //$.ajax({
    //    url: '/MyController/MyLogOutAction',
    //    async: false,
    //    data: {

    //    },
    //    error: function () {
    //    },
    //    success: function (data) {
    //    },
    //});
};


window.onbeforeunload = function () {
    if (closing_window) {
        toDoWhenClosing();
    }
};

} ;

попробуйте, я уверен, что это сработает для вас.

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<script type='text/javascript'>
    $(function() {

        try{
            opera.setOverrideHistoryNavigationMode('compatible');
            history.navigationMode = 'compatible';
        }catch(e){}

        function ReturnMessage()
        {
            return "wait";
        }

        function UnBindWindow()
        {
            $(window).unbind('beforeunload', ReturnMessage);
        }

        $(window).bind('beforeunload',ReturnMessage );
    });
</script>

Попробуйте это. Это сработает. Метод выгрузки jquery устарел. {* } Язык SQL — Hibernate MySQL Dialect, Oracle Dialect, … с некоторыми изменениями или добавленной функциональностью.

window.onbeforeunload = function(event) {
    event.returnValue = "Write something clever here..";
};
<script type="text/javascript" language="Javascript">

function DetectBrowserExit()
{
   alert('Execute task which do you want before exit');
}

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

</script>

Я тестировал этот сценарий в следующих веб-браузерах: В настоящее время веб-браузер Opera не поддерживает событие onBeforeUnload. Internet ExplorerMozilla FirefoxGoogle ChromeSafari