"重新打开最后一个关闭的选项卡“;导致显示最后一个ajax请求内容
"Re open last closed tab" causing to show last ajax request content
当ajax请求发生时,我使用HTML5历史api来保存状态,如果用户请求同一页面,而没有ajax请求,我会提供完整的HTML内容。
浏览器的"重新打开最后一个关闭的选项卡"功能在不影响服务器的情况下带来最后一个ajax请求内容。如果浏览器在不带最后请求内容的情况下进行请求,那么一切都会顺利进行。但浏览器只显示最后一个ajax请求的内容。
我在Chrome 17和Firefox 10上都有过这种体验。(我没有在ie9上尝试过,因为它没有支持历史api)
这个问题的解决方案是什么?
编辑:这些ajax请求只是对服务器的"获取"请求。
在jsfiddle.net中演示它确实是不可能的,原因很少。您可以在本地主机中演示它,如下所示。
向服务器发出"get"请求并提取json对象,然后将该url推送到历史api中,如下所示。
history.pushState(null,null,url);
然后关闭该选项卡,然后单击浏览器的"重新打开上次关闭的选项卡"功能。你看到了什么?Json响应机构?浏览器显示它而不向服务器发出请求,对吗?
问题是由http响应标头引起的。标头包含ajax请求的可缓存信息,所以浏览器显示缓存中的url内容,而不会命中数据库。
从响应头中删除缓存参数后,浏览器就可以在不从缓存中获取内容的情况下访问服务器。
当您重新打开一个关闭的选项卡时,浏览器可以重用给定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");
这完全取决于您使用的浏览器以及启用的优化。
例如,谷歌Chrome会将页面保存在内存中,所以当你反击并将其转到新网站时,或者当你重新打开关闭的选项卡时,它会从内存中恢复页面。
较旧/较慢的浏览器只会刷新任何内容。
尽管这应该不是一个真正的问题,因为您的javascript状态也应该恢复——当他们重新打开该页面时,在各个方面都应该完全相同。
- dataTables-如何自定义分页类型以显示最后一个页码后面的省略号,
- 浮动图-如何在x轴上显示第一个月和最后一个月的minTickSize:[2,“month&”]
- 多个图像显示带有动态创建的画布的最后一个图像并分配给图像
- jQuery自定义验证只显示最后一个字段的错误
- ExtJS DataView只显示最后一个JSON元素
- 有角度的ng重复只显示最后一个元素.如果只有一个元素;我什么也不展示
- 谷歌地图没有显示地图上的所有目的地标记,只有第一个和最后一个
- Javascript - 循环访问对象数组,仅显示最后一个对象
- 显示最后一个元素后刷新页面
- 在分页中显示数据表的第一个和最后一个按钮
- AngularJS:仅在最后一个选项卡上显示过滤的内容
- 默认情况下,在 angularjs 中选择下拉列表中的最后一个位置显示占位符
- 数据表:禁用第一个下一个上一个最后一个,并在处理时显示/搜索记录
- Javascript Array 只显示最后一个孩子
- 在“ng-repeat”中仅显示第一个和最后一个子项作为结果
- 为什么从其他网络返回会保留最后一个哈希值,同时显示第一个哈希值的内容
- Javascript-在while循环结束后仅显示数组中的最后一个值
- infowindow.setContent 方法仅显示最后一个帐户名
- 谷歌可视化散点图只显示最后一个系列的工具提示
- Jquery悬停,高亮显示除最后一个单元格之外的表行