我需要维护一个带有 AJAX 搜索表单的网站(比如,搜索书籍),并且希望搜索结果成为浏览器历史的一部分。
因此,我设置了"popstate"事件处理程序。
window.addEventListener('popstate', function(e) {
alert("popstate: " + JSON.stringify(e.state));
});
在成功的AJAX请求后调用pushState():
var stateObj = { q: "harry potter" };
window.history.pushState(stateObj, "Result", "/search");
我的点击流程如下:
- 加载带有搜索表单的页面 - 普通请求 - 路径为 /
- 输入查询字符串并提交表单 - AJAX 请求 - 路径更改为 /search
- 点击搜索结果 - 普通请求 - 路径更改为 /books/harry-potter
- 当我现在通过点击浏览器的后退按钮返回时,我期望"popstate"事件会被触发,并显示相应的状态对象。但是什么都没有发生。 - 路径更改为 /search
当我再次点击后退按钮时,我会收到一个弹出窗口,其中包含
popstate: null
- 路径更改为 /然后,当我向前导航后,我会收到
popstate: {"q":"harry potter"}
- 路径更改为 /search
所以,重要的 popstate 事件(带有查询字符串的那个)只有在向前导航时才会被触发,而在返回时则不会。
这是因为我正在从一个历史记录条目被自动创建而不是通过 pushState 编程方式创建的网站返回吗?但如果是这样,那么 History API 只对完整的单页面应用程序有意义。
在任何浏览器中行为都是相同的。希望你能帮我解决问题 :)