我有一个页面,其中有几个搜索/筛选按钮,当点击这些按钮时,通过 AJAX 刷新下面列表的内容。
在这个过程中,我会修改历史记录(通过 pushstate),以便新的筛选页面可以被书签,并且返回按钮正常工作。同时,我也监听 popstate 事件来响应“返回”操作。
我的代码大致如下:
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”)
- 他们运行了一些筛选器,然后按了几次“回退”按钮,回到了“B”的初始状态
- 他们再次点击“后退”按钮,回到“A”
- 此时,如果他们按下“向前”按钮,浏览器不会再次向服务器请求页面“B”,而是将一堆JSON代码显示为页面内容(这个JSON是我通过AJAX请求过滤内容的响应)
至少在最新版的Chrome中出现了这种情况
为什么会发生这种情况,我该如何避免?