Javascript window.onbeforeunload侦听器在Firefox中关闭选项卡时未触发

Javascript window.onbeforeunload侦听器在Firefox中关闭选项卡时未触发,javascript,html,google-chrome,firefox,local-storage,Javascript,Html,Google Chrome,Firefox,Local Storage,问题 我有一个函数应该在window.onbeforeunload上运行。在Chrome中,它可以正常工作,并在关闭或刷新选项卡或窗口时运行。然而,在Firefox中,它只在刷新时运行,不在关闭时运行 代码 以下是一个例子: var onStorageUpdate = function(){ var lastUnloaded = localStorage.getItem("LastUnloaded"); if(lastUnloaded === null){ $("

问题

我有一个函数应该在window.onbeforeunload上运行。在Chrome中,它可以正常工作,并在关闭或刷新选项卡或窗口时运行。然而,在Firefox中,它只在刷新时运行,不在关闭时运行

代码

以下是一个例子:

var onStorageUpdate = function(){
    var lastUnloaded = localStorage.getItem("LastUnloaded");
    if(lastUnloaded === null){
        $("div").text("Never stored");
    }
    else{
        $("div").text(lastUnloaded);
    }
};

onStorageUpdate();

window.addEventListener("beforeunload", function(){
    var now = Date.now();
    localStorage.setItem("LastUnloaded", now);
});

window.addEventListener("storage", function(){
    onStorageUpdate();
});
以下是在上述代码中应该工作的事件顺序:

  • 在初始页面加载时,尝试从localStorage获取
    LastUnload
    。如果未检索到任何内容,则显示“从未存储”,否则显示存储的值(应为长整数时间戳)
  • 卸载选项卡时,使用当前时间戳更新
    lastdunload
    。这是关闭窗口时在Firefox中似乎不起作用的部分
  • 在本地存储发生更改时,更新DOM以显示时间戳
  • 演示

    下面是示例的代码笔:

    要测试它,请在两个不同的窗口或选项卡中打开链接。您应该注意,当刷新任一选项卡时,两个选项卡都会更新以显示相同的时间戳。在Chrome中,您会注意到,如果关闭一个选项卡,另一个选项卡将更新其时间戳。在Firefox中,您会注意到时间戳没有得到更新


    有什么想法吗?提前谢谢

    我最后只使用了onunload,它在任何地方都能正常工作。

    不知道为什么有人提出“关闭”请求?这个问题显然与编程有关。根据
    beforeunload
    事件的意图,它提供了一种提示用户并允许他们取消页面卸载的方法。他们的文档还表明,该活动的标准在浏览器实现方面存在很大差异。因此,对于初学者,您可能应该为此使用
    unload
    事件。我还听说,由于浏览器之间的行为不一致,因此不应依赖于运行的
    unload
    事件。@maurice和您可以使用它来保存页面状态,您不需要用它来提示用户。@epascarello true,但问题是页面状态的保存是在可能取消
    卸载之前还是之后进行的。如果您正在保存一个键,如
    lastAttemptedUnload
    ,则它可能属于
    卸载之前的
    处理程序。被称为
    lastdunloaded
    ,我认为其目的是捕获页面已卸载的实际事件。@Jake如果刷新未关闭的页面,Firefox中的存储密钥是否已更新?如果是,在另一个选项卡中手动更改存储密钥是否会导致onstorage更新?可能Firefox不支持跨选项卡的事件。