Как определить окно браузера/вкладку "Закрыть событие"?
Я пытаюсь использовать onbeforeunload и выгружать функцию. Но это не сработало. При нажатии ссылки или обновлении это событие активизировалось. Я хочу событие, которое запускается только при закрытии окна браузера или вкладки. Код должен работать во всех браузерах.
Я использую следующий код на главной странице.
<script type="text/jscript">
var leaving = true;
var isClose = false;
function EndChatSession() {
var request = GetRequest();
request.open("GET", "../Chat.aspx", true);
request.send();
}
document.onkeydown = checkKeycode
function checkKeycode(e) {
var keycode;
if (window.event)
keycode = window.event.keyCode;
else if (e)
keycode = e.which;
if (keycode == 116) {
isClose = true;
}
}
function somefunction() {
isClose = true;
}
window.onbeforeunload = function (e) {
if (!e) e = event;
if (leaving) {
EndChatSession();
e.returnValue = "Are You Sure";
}
}
function GetRequest() {
var xmlHttp = null;
try {
// Firefox, Opera 8.0+, Safari
xmlHttp = new XMLHttpRequest();
}
catch (e) {
//Internet Explorer
try {
xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
}
catch (e) {
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
}
return xmlHttp;
}
</script>
и в теге моего тела:
Выше код работает в IE, но не в хроме...
Ответы
Ответ 1
Этот код предотвращает события флажка. Он работает, когда пользователь нажимает кнопку закрытия браузера, но не работает, когда установлен флажок. Вы можете изменить его для других элементов управления (texbox, radioobutton и т.д.).
window.onbeforeunload = function () {
return "Are you sure?";
}
$(function () {
$('input[type="checkbox"]').click(function () {
window.onbeforeunload = function () { };
});
});
Ответ 2
Вы не можете обнаружить его с помощью javascript.
Только события, которые обнаруживают разгрузку/закрытие страницы, window.onbeforeunload и window.unload. Ни одно из этих событий не может сказать вам, как вы закрыли страницу.
Ответ 3
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js"></script>
<script type="text/javascript">
var validNavigation = false;
function wireUpEvents() {
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 = 'ServerThemes.Net Recommend BEST WEB HOSTING at new tab window. Good things will come to you'
function goodbye(e) {
if (!validNavigation) {
window.open("http://serverthemes.net/best-web-hosting-services","_blank");
return leave_message;
}
}
window.onbeforeunload=goodbye;
// 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>
Я ответил на Можете ли вы использовать JavaScript, чтобы определить, закрыл ли пользователь вкладку браузера? закрыл браузер? или покинул браузер?
Ответ 4
Вы также можете сделать, как показано ниже.
введите ниже script код в теге заголовка
<script type="text/javascript" language="text/javascript">
function handleBrowserCloseButton(event) {
if (($(window).width() - window.event.clientX) < 35 && window.event.clientY < 0)
{
//Call method by Ajax call
alert('Browser close button clicked');
}
}
</script>
вызывать функцию выше из тега body, как показано ниже
<body onbeforeunload="handleBrowserCloseButton(event);">
Спасибо
Ответ 5
чтобы сделать разницу между обновлением и закрытой вкладкой или навигатором, вот как я ее исправил:
<script>
function endSession() {
// Browser or Broswer tab is closed
// Write code here
}
</script>
<body onpagehide="endSession();">
</body>
Ответ 6
Решение размещено здесь
После моего первоначального исследования я обнаружил, что когда мы закрываем браузер, браузер закрывает все вкладки одну за другой, чтобы полностью закрыть браузер. Следовательно, я заметил, что между закрытием вкладок будет очень небольшая задержка. Поэтому я использовал эту задержку в качестве основной точки проверки и смог обнаружить событие закрытия браузера и вкладки.
//Detect Browser or Tab Close Events
$(window).on('beforeunload',function(e) {
e = e || window.event;
var localStorageTime = localStorage.getItem('storagetime')
if(localStorageTime!=null && localStorageTime!=undefined){
var currentTime = new Date().getTime(),
timeDifference = currentTime - localStorageTime;
if(timeDifference<25){//Browser Closed
localStorage.removeItem('storagetime');
}else{//Browser Tab Closed
localStorage.setItem('storagetime',new Date().getTime());
}
}else{
localStorage.setItem('storagetime',new Date().getTime());
}
});
JSFiddle Link
Ответ 7
Да, есть! После много головной боли я нашел одно решение для этого.
Monitor.php
Этот php файл будет отслеживать событие закрытия браузера. Как только браузер будет закрыт, connection_aborted вернет 1, следовательно, цикл сломается.
<?php
// Ignore user aborts and allow the script
// to run forever
ignore_user_abort(true);
set_time_limit(0);
echo connection_aborted();
while(1)
{
echo "Whatever you echo here wont be printed anywhere but it is required in order to work.";
flush();
if(connection_aborted())
{
break;
// Breaks only when browser is closed
}
}
/*
Action you want to take after browser is closed.
Write your code here
*/
?>
Caller.php
Это файл, который вызывается Monitor.php
<?php
Header('Location: monitor.php');
?>
Parent.html
Это будет файл, с которым вы фактически будете взаимодействовать. При загрузке это приведет непосредственно к вызову AJAX Caller.php, который автоматически запустит Monitor.php в фоновом режиме.
<script>
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
}
}
xmlhttp.open("GET", "Caller.php", true);
xmlhttp.send();
</script>
Итак, последний поток - Parent.html ----- > Caller.php ----- > Monitor.php