#asp-classic
Вопрос:
Есть ли какой-либо способ узнать, закрывает ли пользователь вкладку в веб-браузере? В частности, IE7, но также FireFox и другие. Я хотел бы иметь возможность справиться с этой ситуацией из нашего кода asp, если закроется текущая вкладка, содержащая наш веб-сайт.
Ответ №1:
onbeforeunload также вызывается при следующих событиях —
* Close the current browser window.
* Navigate to another location by entering a new address or selecting a Favorite.
* Click the Back, Forward, Refresh, or Home button.
* Click an anchor that refers the browser to another Web page.
* Invoke the anchor.click method.
* Invoke the document.write method.
* Invoke the document.open method.
* Invoke the document.close method.
* Invoke the window.close method.
* Invoke the window.open method, providing the possible value _self for the window name.
* Invoke the window.navigate or NavigateAndFind method.
* Invoke the location.replace method.
* Invoke the location.reload method.
* Specify a new value for the location.href property.
* Submit a form to the address specified in the ACTION attribute via the INPUT type=submit control, or invoke the form.submit method.
Таким образом, если вы пытаетесь выйти из системы пользователя, если он закроет вкладку или окно браузера, вы в конечном итоге будете выходить из системы каждый раз, когда он нажимает ссылку или отправляет страницу.
Ответ №2:
Прикрепите событие «onbeforeunload«. Он может выполнить код непосредственно перед закрытием браузера/вкладки.
Комментарии:
1. Спасибо, ребята. Я передаю эти сведения нашему разработчику asp и буду голосовать за ответы, основанные на ее выводах.
2. Обратите внимание, что onbeforeunload не работает в Opera. однако onunload работает в Opera, но только при переходе со страницы, например, по ссылке. onunload не сработает в Opera, если вы закроете вкладку или перезагрузите страницу.
3. Прежде чем начать использовать событие onbeforeunload, убедитесь, что вы понимаете, что оно делает. Прочитайте ответ Сантоша, а также мой ответ. Это сэкономит вам много времени, потому что, если вы просто прикрепите событие onbeforeunload, как предлагает Eran, вы увидите, что это событие срабатывает гораздо чаще, чем вы ожидаете.
Ответ №3:
Делает ли document.unload не делать этого, если вы?
Комментарии:
1. document.unload работает на стороне клиента, поэтому вам придется сделать еще один шаг, чтобы иметь возможность обрабатывать его на стороне сервера (в вашем коде asp) и, возможно, выполнить запрос AJAX от обработчика событий выгрузки документа?
2. Сработает ли асинхронный вызов? Я имею в виду… вкладка убивается, конечно, лучше быть синхронным и каким-то образом заблокировать ее.
3. Вам не нужен синхронный запрос, потому что страница не заботится об ответе (на самом деле она, вероятно, будет закрыта к моменту возврата ответа).
Ответ №4:
Если вам нужно знать, когда страница закрыта на стороне сервера, лучше всего периодически пинговать сервер со страницы ( XMLHttpRequest
например , через). Когда пингинг прекращается, страница закрывается. Это также сработает, если браузер вышел из строя, был закрыт или компьютер был выключен.
Ответ №5:
Как предложил Эран Гальперин, используйте onbeforeunload
. В частности, верните строку, и эта строка будет включена в диалоговое окно подтверждения, которое позволит пользователю выбрать, покидать страницу или нет. Каждый браузер содержит некоторый текст до и после возвращаемой строки, поэтому вам следует протестировать его в разных браузерах, чтобы увидеть, что будет представлено пользователю.
Ответ №6:
Я уверен, что ОП задает вопрос из контекста самой веб-страницы, но для любых разработчиков Firefox-аддонов, которые сталкиваются с этим вопросом, вы можете использовать TabClose
событие. https://developer.mozilla.org/en/Code_snippets/Tabbed_browser#Notification_when_a_tab_is_added_or_removed
Ответ №7:
Сантош прав, это событие будет вызвано многими другими действиями, а не просто нажатием кнопки закрытия вашей вкладки/браузера. Я создал небольшой хак, чтобы предотвратить запуск действия onbeforeunload, добавив следующую функцию в document ready.
$(function () {
window.onbeforeunload = OnBeforeUnload;
$(window).data('beforeunload', window.onbeforeunload);
$('body').delegate('a', 'hover', function (event) {
if (event.type === 'mouseenter' || event.type === "mouseover")
window.onbeforeunload = null;
else
window.onbeforeunload = $(window).data('beforeunload');
});
});
Кроме того, перед запуском любого из событий, упомянутых Сантошем, вам необходимо запустить эту строку:
window.onbeforeunload = null;
Если вы не хотите, чтобы событие запускалось.
И вот последний фрагмент кода:
function OnBeforeUnload(oEvent) {
// return a string to show the warning message (not every browser will use this string in the dialog)
// or run the code you need when the user closes your page
return "Are you sure you want to close this window?";
}