10

有这样的事吗?

我知道我可以在所有链接的单击事件上挂钩我的函数,但是还有其他页面更改的情况,例如刷新或不同的脚本更改 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 :)

4

3 回答 3

27

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)。

于 2012-06-24T11:56:59.220 回答
6

jQuery 有卸载功能:

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

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

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

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

$(window).bind('beforeunload', function() {
    // do something, preferably ajax request etc
    return 'are you sure?';
});
于 2012-06-24T11:58:23.660 回答
1

当一个页面被重新加载时,之前的任何东西都会消失。因此,您所说的似乎是您在 DOMReady 中执行的操作或在页面中“加载”,因为您无法将前一页面中的代码“推送”到新上下文中。

于 2012-06-24T11:57:35.280 回答