有这样的事吗?
我知道我可以在所有链接的click事件上挂钩我的函数,但是还有其他情况会更改页面,例如刷新或当其他脚本更改window.location
最后,我通过从unload事件发送一个字符串postMessage来完成它,如下所示:
$(window).bind('unload', function(e){
window.parent.postMessage('unloading');
});
父文档中的:
$(window).bind('message', function(e){
if(e.originalEvent.data == 'unloading'){
// ajax stuff here
}
});
似乎有效。 我可能应该提到有一个iframe参与:)
答案 0 :(得分:23)
有beforeunload
event,当页面被拆除时被触发(要么跟随链接,要么关闭窗口,或者刷新等)。例如:
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请求并更新一些内容......
当页面被拆除时,您通常可以使用同步 ajax调用(async: false
),只要它不会花费太长时间。这不是一个好主意,如果可以的话,我强烈建议避免使用它(例如,使用临时保存),因为它会引入关闭页面的延迟。但是如果你使调用同步(而不是默认的,非常首选的异步调用),通常浏览器会让你这样做。当然,如果浏览器突然终止(崩溃,被用户强制关闭等),那对你没有好处。
请注意jQuery(is being deprecated and removed)中的async
标记ticket。我认为他们计划在1.8中弃用它并实际在1.9中将其删除,但是从博客帖子和票证中看不出来。
答案 1 :(得分:5)
jQuery有unload功能:
当用户导航时,会将unload事件发送到window元素 远离页面。这可能意味着很多事情之一。用户可以 点击链接离开页面,或输入新的URL 地址栏。前进和后退按钮将触发事件。 关闭浏览器窗口将导致触发事件。甚至 页面重新加载将首先创建一个卸载事件。
请注意,这应绑定到window
对象而不是document
:
$(window).unload(function() {
// do something
});
您还可以将处理程序绑定到beforeunload
事件:
$(window).bind('beforeunload', function() {
// do something, preferably ajax request etc
return 'are you sure?';
});
答案 2 :(得分:1)
当重新加载页面时,之前的任何内容都将消失。因此,您所谈论的内容似乎是您在DOMReady或新页面中执行的操作,因为您无法将代码从前一页“推送”到新的背景。