当只有位置哈希更改时,有没有办法响应在javascript中点击后退按钮(或按下退格键)?也就是说,当浏览器不与服务器通信或重新加载页面时。
有没有办法在javascript中捕获后退按钮事件?
使用hashchange
事件:
window.addEventListener("hashchange", function(e) {
// ...
})
如果您需要支持旧浏览器,请查看Modernizr 的 HTML5 Cross Browser Polyfills wiki 页面中的hashChange
事件部分。
我创建了一个可能对某些人有用的解决方案。只需将代码包含在您的页面上,您就可以编写自己的函数,在单击后退按钮时将调用该函数。
我已经在 IE、FF、Chrome 和 Safari 中进行了测试,并且都可以正常工作。我的解决方案基于 iframe 工作,无需不断轮询,在 IE 和 FF 中,但是,由于其他浏览器的限制,在 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
};
}
};
然后,我在我的站点脚本中添加了一行以pageload.loadUrl
在hashchange事件上运行该函数,如下所示:
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 事件,您可以收听它。
onLocationChange
也可能有用。不确定这是否是 Mozilla 独有的东西,看起来可能是。