有beforeunload
事件,当页面被拆除时触发(或者跟随链接,或者如果窗口正在关闭,或者刷新等)。例子:
window.onbeforeunload = function(event) {
var s = "You have unsaved changes. Really leave?";
event = event || window.event;
if (event) {
// This is for IE
event.returnValue = s;
}
// This is for all other browsers
return s;
}
由于显而易见的原因,您可以在beforeunload
事件处理程序中执行的操作受到非常严格的限制,并且如您所见,上面的beforeunload
处理程序具有与普通事件处理程序不同的签名。基本上,您的代码不能做任何异步操作,不能打开新窗口,也不能取消事件。它可以返回一个字符串,如果是,浏览器会弹出一个窗口,询问您是否真的要离开该页面,并在该弹出窗口中包含您的字符串。
根据您对问题的评论:
我之前需要它,所以我可以触发一个 ajax 请求并更新一些东西......
在最初提出问题多年后,这里的方法是使用beacon API。这使您可以向服务器发送非阻塞异步请求,而不会减慢浏览器拆除页面并导航到下一个页面的过程:
navigator.sendBeacon("/path/to/notify", optionalData);
这是一个发送后忘记的方法,但是当您的页面被拆除时浏览器不会取消它(就像它执行标准的异步 ajax 请求一样)。相反,它允许该请求完成,即使您的页面已被删除。
早在 2012 年最初编写此答案时,您通常可以使用同步ajax 调用 ( async: false
),只要它不会花费太长时间。但是你现在不能可靠地做到这一点(这从来都不是一个好主意,它支撑了 UI)。