在页面更改之前运行的Javascript事件

有这样的事吗?

我知道我可以在所有链接的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参与:)

有一个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请求并更新一些东西……

当页面被拆除时,通常可以使用同步 ajax调用( async: false ),只要它不需要太长时间。 这不是一个好主意,我强烈建议你尽可能避免它(例如,使用临时保存),因为它引入了关闭页面的延迟。 但是如果你使调用同步(而不是默认的,非常首选的异步调用),通常浏览器会让你这样做。 当然,如果浏览器突然终止(崩溃,被用户强制关闭等),那对你没有好处。

请注意, async标志已被弃用并从jQuery( ticket )中删除 。 我认为他们计划在1.8中弃用它并实际在1.9中将​​其删除,但是从博客文章和票证来看并不是很清楚。

jQuery有卸载function:

当用户离开页面时,卸载事件被发送到窗口元素。 这可能意味着很多事情之一。 用户可以单击链接离开页面,或在地址栏中键入新URL。 前进和后退按钮将触发事件。 关闭浏览器窗口将导致触发事件。 即使页面重新加载也会首先创建一个卸载事件。

请注意,这应绑定到window对象而不是document

 $(window).unload(function() { // do something }); 

您还可以将处理程序绑定到beforeunload事件:

 $(window).bind('beforeunload', function() { // do something, preferably ajax request etc return 'are you sure?'; }); 

重新加载页面时,之前的任何内容都将消失。 因此,您所谈论的内容似乎是您在DOMReady或页面中“加载”的内容,因为您无法将代码从前一页“推送”到新的上下文中。