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

时间:2012-06-24 11:54:51

标签: javascript jquery

有这样的事吗?

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

3 个答案:

答案 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或页面中执行的操作,因为您无法将代码从前一页“推送”到新的背景。