onunload
或 onbeforeunload
事件。close
。如果我理解有误,请纠正我。来自MDN文档
由于某些原因,基于Webkit的浏览器不遵循对话框的规范。下面的示例几乎可以实现跨浏览器功能。
window.addEventListener("beforeunload", function (e) {
var confirmationMessage = "\o/";
(e || window.event).returnValue = confirmationMessage; //Gecko + IE
return confirmationMessage; //Webkit, Safari, Chrome
});
这是一个处理所有浏览器的示例。
beforeunload
或 onbeforeunload
提供自定义消息。以下是2019年的浏览器兼容性:https://developer.mozilla.org/en-US/docs/Web/API/WindowEventHandlers/onbeforeunload#Browser_compatibility - Kenny Alvizuriswindow.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') ;
}
}
//如果你在关闭仅有一个标签页的IE7浏览器或窗口,则此方法可行。
window.onunload = "alert('wait')"
和window.onbeforeunload = "alert('wait... chrome!')"
,但是当我关闭选项卡时,两者都没有触发。 - icedwaterwindow.onunload = "alert('wait')"
和类似的代码实际上不起作用。根据MDN文章,应该为函数分配一个字符串值到事件对象的returnValue属性中,并返回相同的字符串。 - Dmytro Vyprichenko对于类似任务,您可以使用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.addEventListener("beforeunload", function (e) {
$.ajax({
type: "POST",
url: startTimerUrl,
async: false
});
return;
});
cancelLogout
标志设置为false。如果用户刷新页面或导航到另一个内部链接,则服务器上的cancelLogout
标志将设置为true。一旦计时器事件过期,它会检查cancelLogout
标志以查看注销事件是否已被取消。如果计时器已被取消,则会停止计时器。如果浏览器或选项卡被关闭,则cancelLogout
标志将保持false,事件处理程序将注销用户。Controller.OnActionExecuted()
方法中取消注销。我发现了一种方法,在我所有的浏览器上都可以运行。
已在以下版本进行测试: 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
}
};
});
虽然没有事件,但是有一个属性window.closed
,在本文撰写时被所有主流浏览器支持。因此,如果您真的需要知道,可以轮询窗口以检查该属性。
if(myWindow.closed){do things}
注意:
轮询任何内容通常不是最佳解决方案。如果可能,应使用window.onbeforeunload
事件,唯一的注意事项是它也会在导航离开时触发。
抱歉,我无法在现有答案中添加评论,但是如果您想要实现一种警告对话框,我想提醒您任何事件处理程序函数都有一个参数 - event。在您的情况下,您可以调用event.preventDefault()来禁止自动离开页面,然后发出自己的对话框。我认为这比使用标准丑陋和不安全的alert()要好得多。我个人基于kendoWindow对象(Telerik的Kendo UI,除了kendoGrid和kendoEditor之外几乎完全开源)实现了自己的一套对话框。您也可以使用jQuery UI的对话框。请注意,这些东西是异步的,您需要绑定每个按钮的onclick事件处理程序,但这很容易实现。
然而,我确实同意缺乏真正的关闭事件是可怕的:例如,如果您想要在后端仅在真正关闭时重置会话状态,这是一个问题。
$(window).unload( function () { alert("Bye now!"); } );
beforeunload
。像这样:$(window).on('beforeunload', function(){ alert ('Bye now')});
- AdrianoRR
sessionStorage
属性,它会在浏览器关闭时过期。https://www.w3schools.com/jsref/prop_win_sessionstorage.asp - csandreas1