Chrome在按下button时显示ajax响应

我遇到了一个问题,如果我使用jQuery的Get方法来获得一些内容,如果我点击回来,而不是实际上回到历史中的一页,而是显示由Ajax查询返回的内容。

有任何想法吗?

http://www.dameallans.co.uk/preview/allanian-society/news/56/Allanian-test

在上面的页面中,如果您在更改页面后单击返回的注释列表下方使用分页,则会显示用于生成注释列表的HTML内容。

我注意到它并不总是这样做,但是如果您点击不同的页面几次,并单击后退button,它只是在窗口而不是网站显示json文本。

由于某种原因,这只会影响Chrome浏览器,因为IE和Firefox工作正常。

确保您的AJAX请求使用完整HTML文档中的其他url。 Chrome会caching最近的请求,即使它只是一个部分。

https://code.google.com/p/chromium/issues/detail?id=108425

万一你使用jQuery和History API(或者像history.js这样的库),你应该把$ .getJSON改为$ .ajax,caching设置为false:

$.ajax({ dataType: "json", url: url, cache: false, success: function (json) {...} }); 

实际上,这是caching系统根据规格预期的行为,而不是铬问题。 caching只根据URL和请求方法(get,post,…)区分请求,而不是任何请求头。

但有一个Vary头告诉浏览器检查caching时考虑一些头。 例如,通过向服务器响应添加Vary:X-Requested-With ,浏览器知道如果请求X-Requested-With标头被改变,则该响应会变化。 或者,通过将Vary:Content-Type添加到服务器响应中,浏览器知道,如果请求Content-Type标头更改,则此响应会有所不同。

您可以将此行添加到PHP的路由器中:

 header('Vary:X-Requested-With'); 

在node.js中使用一个中间件:

 app.use(function(req, res) { res.header('Vary', 'X-Requested-With'); }); 

你也可以在ajax url的结尾添加一个随机值。 这将忽略以前的chromecaching,并会请求一个新的版本

 url = '/?'+Math.random() 

我不能给每个Ajax请求不同的URL,因为它是一个AJAX分页,声明没有caching头没有做任何事情,所以我包括一个小的JavaScript的只有当头为AJAX请求的视图:

 <script> if (typeof jQuery == 'undefined') { window.location = "<?php echo $this->here; ?>"; } </script> 

这是一个肮脏的伎俩,但它的工作原理,如果ajax内容通常加载,容器Jquery加载,所以它什么都不做。 但是,如果你没有周围的内容加载ajax假设的内容,jquery丢失(至less在我的情况下),所以我redirect到当前页面请求所有的标题和脚本正常的GET页面。

如果你把它放在页面的顶部,用户不会注意,因为它不会等待页面加载,只要浏览器得到这4行…redirect

在这里replace; 在您的APP中,通过当前的URL,这是一个CakePhp 2.X

@亚伯拉罕的答案是正确的。 我只想发布Rails解决scheme:只需要添加不同的path到routes.rb

在例子中,我有resource :people ,我想从阿贾克斯组成的索引页面之一,这是人的名单。 直接的方法是创buildindex.js.erb并使用url: people_path通过ajax加载部分。 但是这里出现这个问题。

所以,对于Rails来说,它只需要添加一个不同的路线就好

get 'people_list', to: 'people#index', as: :people_list, format: :js