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

在页面更改之前运行的Javascript事件,javascript,jquery,Javascript,Jquery,有这样的事吗 我知道我可以将我的函数挂接到所有链接的点击事件上,但也有其他情况下页面会发生更改,例如刷新或其他脚本更改window.location 最后,我通过从unload事件发送一条字符串槽postMessage来完成这项工作,如下所示: $(window).bind('unload', function(e){ window.parent.postMessage('unloading'); }); 在父文档中: $(window).bind('message', function

有这样的事吗

我知道我可以将我的函数挂接到所有链接的点击事件上,但也有其他情况下页面会发生更改,例如刷新或其他脚本更改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:)

有一个,当页面被删除时会触发它(或者跟随链接,或者如果窗口被关闭,或者刷新,等等)。例如:

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请求和更新一些东西

在最初提出这个问题很多年后,在这里实现这一点的方法是使用。这样,您就可以向服务器发送非阻塞异步请求,而不会减慢浏览器删除页面并导航到下一页的过程:

navigator.sendBeacon("/path/to/notify", optionalData);
这是一个发送和遗忘的过程,但是当您的页面被删除时,浏览器不会取消它(就像它执行标准的异步ajax请求一样)。相反,它允许完成该请求,即使您的页面已被删除


早在2012年,当这个答案最初被编写出来时,如果不花太长时间,通常可以通过同步ajax调用(
async:false
)解决问题。但是你现在不能可靠地做到这一点(这从来都不是一个好主意,它会占用用户界面)。

当一个页面被重新加载时,以前存在的任何东西都会消失。因此,您所谈论的似乎是您在DOMReady或在新页面中“加载”时要做的事情,因为您无法将代码从前一页面“推送”到新上下文中。

jQuery具有以下功能:

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

请注意,这应该绑定到
窗口
对象,而不是
文档

$(window).unload(function() {
    // do something
});
您还可以在卸载事件之前将处理程序绑定到

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

但在页面加载后不运行吗?我需要它,这样我就可以发出ajax请求并更新一些内容,然后加载页面。在卸载页面之前,您不能真正依赖于执行某些操作的能力。例如,用户可能会突然关闭计算机。jQuery文档页面上的注释表明此事件可能不会太可靠。嗯。。在Chrome中,我在控制台中收到一个错误:卸载期间阻塞警报(“卸载…”)。您不需要执行
确认
警报
,只需返回一个字符串,该字符串将显示在确认框中。使用
confirm
等。在卸载之前,您会得到
阻塞的confirm('you sure?')。
@Esailija非常感谢。一、 我错过了这部分。现在它的工作原理是:)在事件中使用同步ajax对我来说很有效(永远不会使用同步ajax:D)@Esailija:是的,这是为数不多的同步ajax使用案例之一(尽管引入这样的延迟不是很好)。正如我所说,你不能做任何异步的事情。我不确定浏览器是否真的冻结了。如果请求时间太长,它将不会等待响应并关闭页面?@Esailija但一旦发送ajax请求,它将在页面关闭后仍能工作。我刚刚在chrome中测试过,如果你刷新,它将至少等待5秒钟(我在服务器端有
睡眠(5);
)。如果关闭选项卡,它将等待1秒(我的近似值),然后关闭它。@Somebodyisintrouble哈希值实际上不是页面的一部分;它是URL的一部分,只有当新URL使用相同的哈希时,它才会传输。如果您在
http://foo.bar.com/xyz#hello
然后单击指向
http://cnn.com/international
,旧的散列值在新页面中将不可用。@有人质疑问题中没有提到这种或那种方式。没有。如果链接转到另一个域,那么我不在乎我的ajax请求是否没有触发。我只需要更新一些(临时的)东西,它们会在下一页从同一个网站上使用。。