Существует ли какой-либо кросс-браузерный код JavaScript / jQuery, чтобы определить, закрывается ли браузер или вкладка браузера, но не из-за нажатия на ссылку?
javascript
jquery
cometta
источник
источник
sessionStorage
свойство, оно истечет после закрытия браузера. w3schools.com/jsref/prop_win_sessionstorage.aspОтветы:
Если я вас правильно понял, вы хотите знать, когда вкладка / окно эффективно закрывается. Ну, AFAIK - единственный способ
Javascript
обнаружить такие вещиonunload
иonbeforeunload
события.К сожалению (или к счастью?), Эти события также запускаются, когда вы покидаете сайт над
link
кнопкой браузера или назад. Так что это лучший ответ, который я могу дать, я не думаю, что вы можете непосредственно определить чистотуclose
в Javascript. Поправь меня, если я здесь не прав.источник
String
возвращаемое значение изonbeforeunload
. Так что теперь вы больше не сможете отображать пользовательское сообщение перед выгрузкой.unload
?Из документации Firefox
По некоторым причинам браузеры на основе Webkit не следуют спецификации для диалогового окна. Практически перекрестный пример будет близок к приведенному ниже.
Этот пример для обработки всех браузеров.
источник
Простое решение
источник
// Это работает в IE7, если вы закрываете вкладку или браузер только с одной вкладкой
источник
window.onunload = "alert('wait')"
иwindow.onbeforeunload = "alert('wait... chrome!')"
использовал консоль в Chromium / Ubuntu, но ни один не запустился, когда закрыл вкладку.window.onunload = "alert('wait')"
и такое не должно работать на самом деле. «Функция должна присвоить строковое значение свойству returnValue объекта Event и вернуть ту же строку». Пожалуйста, взгляните на статью MDNМне нужно было автоматически выходить из системы при закрытии браузера или вкладки, но не при переходе пользователя к другим ссылкам. Я также не хотел, чтобы в этом случае отображался запрос на подтверждение. После того, как я некоторое время боролся с этим, особенно с IE и Edge, вот что я закончил (проверил работу с IE 11, Edge, Chrome и Firefox) после обоснования подхода этим ответом .
Сначала запустите таймер обратного отсчета на сервере в
beforeunload
обработчике событий в JS. Для правильной работы IE и Edge вызовы ajax должны быть синхронными. Вы также должны использовать,return;
чтобы не показывать диалоговое окно подтверждения так:Запуск таймера устанавливает
cancelLogout
флаг в false . Если пользователь обновляет страницу или переходит на другую внутреннюю ссылку,cancelLogout
флаг на сервере устанавливается в значение true . По истечении события таймера он проверяетcancelLogout
флаг, чтобы увидеть, было ли отменено событие выхода из системы. Если таймер был отменен, он остановит таймер. Если бы браузер или вкладка были закрыты, тоcancelLogout
флаг оставался бы ложным, а обработчик события выводил бы пользователя из системы.Замечание по реализации: я использую ASP.NET MVC 5 и отменяю выход из системы переопределенным
Controller.OnActionExecuted()
методом.источник
OnActionExecuted
?Извините, я не смог добавить комментарий к одному из существующих ответов, но в случае, если вы хотите реализовать своего рода диалоговое окно с предупреждением, я просто хотел упомянуть, что любая функция-обработчик события имеет аргумент - событие. В вашем случае вы можете вызвать event.preventDefault (), чтобы запретить покидать страницу автоматически, а затем запустить собственный диалог. Я считаю, что это лучший вариант, чем использование стандартных уродливых и небезопасных оповещений (). Я лично реализовал свой собственный набор диалоговых окон на основе объекта kendoWindow (пользовательский интерфейс Telerik Kendo, который почти полностью открыт, за исключением kendoGrid и kendoEditor). Вы также можете использовать диалоговые окна из jQuery UI. Обратите внимание, что такие вещи асинхронны, и вам нужно будет привязать обработчик к событию onclick каждой кнопки, но это все довольно просто реализовать.
Однако я согласен с тем, что отсутствие события реального закрытия ужасно: например, если вы хотите сбросить состояние сеанса на бэкэнде только в случае реального закрытия, это проблема.
источник
Для подобных задач вы можете использовать
sessionStorage
для локального хранения данных, пока вкладка браузера не будет закрыта.В
sessionStorage
объект хранит данные только за один сеанс (данные удаляются , когда ушко браузер закрыт). ( W3schools )Это моя ручка .
источник
Событие отсутствует, но есть свойство,
window.closed
которое поддерживается во всех основных браузерах на момент написания этой статьи. Таким образом, если вам действительно нужно знать, вы можете опрашивать окно, чтобы проверить это свойство.if(myWindow.closed){do things}
Примечание. Как правило, опрос не является лучшим решением.
window.onbeforeunload
Событие должно быть использовано , если это возможно, единственный нюанс в том , что она также срабатывает , если вы уйдете.источник
источник
beforeunload
если хотите отобразить предупреждение. Как это:$(window).on('beforeunload', function(){ alert ('Bye now')});
Попробуйте использовать это:
источник
Я нашел способ, который работает во всех моих браузерах .
Протестировано на следующих версиях: Firefox 57, Internet Explorer 11, Edge 41, один из последних Chrome (он не будет отображать мою версию)
источник
Поскольку никто еще не упомянул об этом (8+ лет спустя): WebSocket может стать еще одним эффективным способом обнаружения закрытой вкладки. Пока вкладка открыта и направлена на хост, клиент может поддерживать активное соединение WebSocket с хостом.
Предостережение: обратите внимание, что это решение действительно жизнеспособно для проекта, только если WebSocket не требует каких-либо дополнительных значительных накладных расходов от того, что вы уже делаете.
В течение разумного периода времени (например, 2 минуты) серверная сторона может определить, что клиент отключился после отключения WebSocket, и выполнить любое действие, например, удаление загруженных временных файлов. (В моем крайне специализированном сценарии использования моя цель состояла в том, чтобы завершить работу сервера приложений localhost через три секунды после разрыва соединения WebSocket и прекращения всех действий CGI / FastCGI - любые другие поддерживающие соединение не влияют на меня.)
У меня были проблемы с получением обработчика события onunload для правильной работы с маяками (как рекомендовано в этом ответе ). Закрытие вкладки не вызывало срабатывания маяка, а открытые вкладки вызывали его таким образом, что это могло вызвать проблемы. WebSocket решил проблему, с которой я столкнулся, более аккуратно, потому что соединение закрывается примерно в то же самое время, когда вкладка закрывается, а переключение страниц в приложении просто открывает новое соединение WebSocket внутри окна задержки.
источник
JSFiddle Link
Привет всем, я смог добиться кликов «Определить событие закрытия браузера и вкладки», используя локальное хранилище браузера и метку времени. Надеюсь, что все вы решите свои проблемы с помощью этого решения.
После моего первоначального исследования я обнаружил, что когда мы закрываем браузер, браузер закрывает все вкладки одну за другой, чтобы полностью закрыть браузер. Следовательно, я заметил, что между закрытием вкладок будет очень небольшая задержка. Поэтому я принял эту задержку за основную точку проверки и смог обнаружить событие закрытия браузера и вкладки.
Я протестировал его в браузере Chrome версии 76.0.3809.132 и обнаружил, что работает
:) Проголосуйте, если вы нашли мой ответ полезным ....
источник
источник
here also can be string, that will be shown to the user
в Firefox это не так, как в Chrome, однако ...Проверить это можно с помощью window.closed в обработчике события для события 'unload', подобного этому, но использование тайм-аута необходимо (поэтому результат не может быть гарантирован, если что-то задерживается или препятствует закрытию окна):
Пример JSFiddle (протестировано на поздних версиях Safari, FF, Chrome, Edge и IE11)
источник
Я перепробовал все вышеперечисленные решения, но ни одно из них не сработало для меня, особенно потому, что в моем проекте есть некоторые компоненты Telerik, у которых есть кнопка «Закрыть» для всплывающих окон, и она вызывает событие «beforeunload». Кроме того, кнопка выбора не работает должным образом, когда на вашей странице есть сетка Telerik (я имею в виду кнопки внутри сетки). Поэтому я не смог использовать ни одно из предложенных выше предложений. Наконец-то это решение сработало для меня. Я добавил событие onUnload в тег body _Layout.cshtml. Что-то вроде этого:
а затем добавьте функцию LogOff для перенаправления в Account / LogOff, который является встроенным методом в Asp.Net MVC. Теперь, когда я закрываю браузер или вкладку, он перенаправляется на метод LogOff, и пользователь должен войти в систему, когда вернется. Я проверил это в Chrome и Firefox. И это работает!
источник
Эта функция отображает диалоговое окно подтверждения, если вы закрываете окно или обновляете страницу во время какого-либо процесса в браузере. Эта функция работает во всех браузерах. Вы должны установить isProcess var в вашем процессе ajax.
источник
источник
sendkeylog
?Как уже упоминалось @jAndy, не существует должного кода javascript для обнаружения закрытия окна. Я начал с того, что предложил @Syno.
Я прошел через такую ситуацию и при условии, что вы выполните эти шаги, вы сможете обнаружить это.
Я тестировал его на Chrome 67+ и Firefox 61+.
};
источник
resize
размытым окном. Если он будет размыт в 100 раз, у вас будет 100 слушателей, что в конечном итоге приведет к замедлению работы браузера.попробуйте это, я уверен, что это будет работать для вас.
источник
Попробуй это. Это сработает. Метод выгрузки jquery устарел.
источник