2012-02-25 74 views
6

我使用HTML 5历史api来保存Ajax请求发生时的状态,如果用户请求同一页面没有ajax请求,我提供完整的html内容。“重新打开最后关闭的选项卡”导致显示最后一个Ajax请求内容

浏览器的“重新打开最后关闭的选项卡”功能会将最后一个Ajax请求内容带到服务器。如果浏览器请求不带最后的请求内容,那么一切都会毫无问题地工作。但浏览器只显示最后的ajax请求内容。

我已经经历过这个在Chrome 17,Firefox的10。(我还没有尝试过在IE9,因为它不支持历史API)

什么是众所周知的解决方案,这个问题?

编辑:这些ajax请求只是“获取”请求到服务器。

真的不可能在jsfiddle.net中演示它,因为几个原因。您可以在下面的localhost中演示它。

向服务器发出“请求”请求,并拉动json对象,然后将该url推入历史api中,如下所示。

history.pushState(null,null,url); 

然后关闭该选项卡,然后单击浏览器的“重新打开最后关闭的选项卡”功能。你看到了什么 ? Json响应正文?浏览器显示它没有向服务器发出请求,对吗?

+0

任何人有一个想法? – Freshblood 2012-02-25 16:57:11

+1

你可以发布一些代码,或链接到一个页面来演示这个问题吗? – robertc 2012-02-25 22:29:37

+0

@robertc我更新了问题并提供了演示信息。 – Freshblood 2012-02-26 01:29:24

回答

4

问题是由http响应头引起的。标题包含ajax请求的可缓存信息,因此浏览器显示的是从缓存没有命中到数据库的url内容。

从响应头中删除缓存参数后,浏览器能够在没有从缓存中获取内容的情况下点击服务器。

0

这一切都取决于您使用的浏览器以及启用了哪些优化。

谷歌浏览器会将页面保存在内存中,所以当你回到一个新的网站时,或者当你重新打开关闭的标签时,它会从内存中恢复页面。

旧版/慢版浏览器只会刷新任何内容。

虽然这不应该是一个问题,因为你的javascript状态应该被恢复 - 当它们重新打开那个页面时,它应该完全一样。

+0

我正在使用Chrome和Firefox最新版本而不修改任何设置。应该不是问题吗?用户总是看到最后一个是json的ajax请求内容,我无法向他显示页面的最后状态,我正在使用sammy js实现这些。 – Freshblood 2012-02-26 15:37:39

1

当您重新打开一个关闭的选项卡时,允许浏览器从给定的URL的缓存中重用数据来填充窗口。由于缓存中的数据来自ajax请求响应,这就是它使用的,并且您可以看到JSON。

因此,这导致了一个问题:为什么浏览器在满足ajax请求时不使用缓存中的HTML?浏览器使用不同的规则来确定是否使用缓存内容,具体取决于他们正在做什么。在这种情况下,Chrome很高兴在还原最近关闭的选项卡时重用它,而不是在执行ajax请求时重用它。

您可以通过告诉浏览器永不缓存响应来纠正它。这是否可取决于您的使用情况。

例如,在你的文件的顶部插入这(开幕<?php标签后,当然),使得它不会发生对我来说:

header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0"); 
header("Cache-Control: post-check=0, pre-check=0", false); 
header("Pragma: no-cache"); 
相关问题