12

我有一个页面,其中有几个搜索/过滤按钮,单击这些按钮时,会通过 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 中

为什么会发生这种情况,我该如何避免?

4

3 回答 3

14

Chrome 会缓存您访问的页面,当您返回或前进时,它会使用缓存快速显示页面。如果您用于通过 AJAX 从服务器检索 JSON 的 URL 与 Chrome 会命中的 URL 相同,那么 Chrome 可能会从缓存中选择该页面,而不是漂亮的 HTML,它只是一个 JSON 转储。

于 2013-04-22T17:17:11.233 回答
5

有一个缓存选项$.ajax

$.ajax({ cache: false, url: newURL})

http://api.jquery.com/jquery.ajax/

于 2014-12-17T13:41:24.687 回答
0

@pupeno 是对的,但要给出更面向解决方案的答案,您需要在服务器拥有的路由中区分 JSON 和 HTML。

我知道这样做的两种方法:
1)如果你打电话/users,你会得到HTML,如果你打电话,/users.json你会得到JSON。
2)如果你打电话/users,你会得到HTML,如果你打电话,/api/users你会得到JSON。

我更喜欢 1,但这取决于 web 框架是默认使用的还是你自己配置的。
1 用于 Ruby on Rails,2 也用于其他框架。

于 2018-07-17T18:35:00.270 回答