“重新打开上次关闭的标签”,导致显示最后的ajax请求内容

时间:2012-02-25 16:03:00

标签: javascript ajax html5 web browser-history

我正在使用HTML 5历史API来保存ajax请求时的状态,如果用户请求同一页面没有ajax请求,我提供完整的html内容。

"重新打开最后关闭的标签"浏览器的功能带来了最后的ajax请求内容,而无需点击服务器。如果浏览器会在没有带上一个请求内容的情但浏览器只显示最后的ajax请求内容。

我在Chrome 17,Firefox 10上遇到过这种情况。(我还没试过ie9,因为它没有支持历史记录api)

这个问题有哪些众所周知的解决方案?

编辑:这些ajax请求只是" get"请求服务器。

真的不可能在jsfiddle.net中展示它,因为几乎没有理由。您可以在本地主机中进行演示,如下所示。

制作"得到"请求服务器并拉出json对象,然后将该url推送到历史api中,如下所示。

history.pushState(null,null,url);

然后关闭该标签并点击"重新打开最后关闭的标签"浏览器的功能。你看到了什么 ? Json回应身体?浏览器显示它而不向服务器发出请求,对吧?

3 个答案:

答案 0 :(得分:5)

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

从响应标头中删除缓存参数后,浏览器能够在不从缓存中提取内容的情况下访问服务器。

答案 1 :(得分: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");

答案 2 :(得分:0)

这完全取决于您使用的是哪种浏览器,以及启用了哪些优化。

例如,Google Chrome会将页面保留在内存中,因此当您回击并转到新网站时,或者当您重新打开已关闭的标签页时,它会从内存中恢复该页面。

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

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