有没有办法在javascript中捕捉后退按钮事件?

问题描述:

当只有位置哈希值变化时,有没有一种方法可以响应JavaScript中的后退按钮(或按下退格键)?也就是说,当浏览器不与服务器通信或重新加载页面时。有没有办法在javascript中捕捉后退按钮事件?

使用hashchange事件:

window.addEventListener("hashchange", function(e) { 
    // ... 
}) 

如果您需要支持旧的浏览器,检查出的Modernizr的HTML5跨浏览器Polyfills wiki页面的hashChange Event section

+0

很高兴看到来自*的答案已经在老问题的谷歌命中的顶部。这对我很有帮助,但是在我调用的代码中存在一些问题,如果它改变了,它不会让哈希更改行执行。一个好的提示可能是最后一次。 – ironfroggy 2008-11-06 23:45:56

+17

在当前的浏览器中,您应该使用onhashchange事件http://msdn.microsoft.com/en-us/library/cc288209(v=vs.85).aspx – EricLaw 2011-08-27 19:27:02

+0

好的改进答案。 – pqsk 2015-02-07 03:18:59

onLocationChange也可能有用。不知道这是否是Mozilla专用的,看起来可能是这样。

我已经创建了一个solution,这可能对某些人有用。只需在页面上包含代码,并且您可以编写自己的函数,单击后退按钮时将调用该函数。

我已经在IE,FF,Chrome和Safari中测试过了,都在工作。在IE和FF中,我使用的基于iframe的解决方案无需进行持续轮询,但由于其他浏览器的局限性,Safari中使用了位置哈希。

我做了一个有趣的黑客解决这个问题,我满意。我有一个动态加载内容的AJAX站点,然后修改window.location.hash,并且有代码在$(document).ready()上运行来解析哈希并加载相应的部分。问题是,我对我的部分导航代码非常满意,但想要添加一种拦截浏览器后退和前进按钮的方法,这会改变窗口位置,但不会干扰当前页面加载例程,我在其中操作window.location,并以固定间隔轮询window.location是不可能的。

我最终什么事做的是创建一个对象,例如:

var pageload = { 
    ignorehashchange: false, 
    loadUrl: function(){ 
     if (pageload.ignorehashchange == false){ 
      //code to parse window.location.hash and load content 
     }; 
    } 
}; 

然后,我添加了一行到我的网站脚本运行于hashchange事件pageload.loadUrl功能,例如:

window.addEventListener("hashchange", pageload.loadUrl, false); 

然后,如果我想修改window.location.hash而不触发这个页面加载例程,我只需在每个window.location.hash =行之前添加以下行:

pageload.ignorehashchange = true; 

,然后每个哈希修改行后以下行:

setTimeout(function(){pageload.ignorehashchange = false;}, 100); 

所以现在我的部分加载程序通常运行,但如果用户点击“返回”或“前进”按钮时,新位置将被解析并加载相应的部分。

结账history.js。有一个HTML 5 statechange事件,你可以听它。