我有一个页面,其中有几个搜索/过滤按钮,单击这些按钮时,会通过 AJAX 刷新下面列表的内容。
在此过程中,我正在修改历史记录(通过 pushstate),以便新过滤的页面可以添加书签,因此后退按钮可以使用。我也在监听 popstate 事件,对 Back 做出反应。
我的代码看起来或多或少是这样的:
window.addEventListener("popstate", function(ev) {
if (!window.history_ready) { return; } // Avoid the one time it runs on load
refreshFilter(window.location.href, true);
});
refreshFilter: function(newURL, backButtonPressed){
$.ajax({ url: newURL}).done( blah );
if (!backButtonPressed) {
window.history_ready = true;
history.pushState(null, null, newURL);
}
}
这非常有效,除了一个奇怪的情况......
- 用户在页面“A”中
- 他们点击一个链接进入这个播放历史的页面(我们称之为“B”)
- 他们运行了几个过滤器,然后按了几次 Back,所以他们回到了“B”的初始状态
- 他们再次单击返回,这会将他们发送回“A”
- 此时,如果他们按下 Forward,浏览器不会再次向服务器请求页面“B”,而是简单地显示一堆 JSON 代码作为页面内容(这个 JSOn 是我的一个 AJAX 请求的响应过滤东西)
至少在最新的 Chrome 中
为什么会发生这种情况,我该如何避免?