javascript - 当单击“后退”按钮查看文档时,如何强制 Web 浏览器重新加载文档?

标签 javascript html browser-cache

我在 StackOverflow 上看到了相关问题,但没有一个建议对我有用。我需要浏览器在每次显示时从服务器重新加载页面,包括用户是否通过按“后退”按钮到达那里。浏览器似乎对除基本文档以外的所有内容都遵守缓存规则。这发生在当前版本的 Safari 和 Firefox 中(截至 2013 年 12 月),已通过数据包捕获进行验证。

我的应用程序中的页面用于编辑数据库记录。在源文件的顶部是几行 PHP,用于存储一个锁,指示正在编辑记录。锁定存在时,其他用户无法编辑同一记录。这些页面有一个窗口 unload 处理程序,它在非异步模式下使用 AJAX 来释放锁定。 (锁定机制还有更多内容,但这些都是相关的部分。)当用户通过“后退”按钮返回页面时,服务器端代码从不执行。

我试过包含标题:

Cache-Control: no-cache, must-revalidate

Safari 的检查器显示标题已收到并处理,但它仍然没有重新检索页面。

我已经尝试设置一个处理程序来检查页面的状态是否得到维护:

window.onpageshow = function(event) {
    if (event.persisted) {
        window.location.reload();
    }
};

if 条件从不匹配:event.persisted 始终为 false。

令人讨厌的是,这在技术上似乎是正确的。根据relevant part of the HTML5 spec ,因为页面注册了一个 unload 监听器,浏览器应该永远尝试维护页面状态。它没有!当用户按下后退按钮时,浏览器将“重放”整个页面加载序列,包括 ready 事件。它会重复任何未缓存先前结果的 AJAX 调用。它唯一拒绝从服务器实际重新加载的是主文档本身。

如何让它重新加载主文档?

最佳答案

快速回答:

不,你不能...“后退”按钮比其他按钮更具侵略性和不同的缓存。一些见解:

Why is Google Chrome going to the server on pushState?

https://github.com/nickhsharp/prefetchNightmare

就是说……GET 请求(浏览器加载它)不应该对服务器“做”任何事情……如果有的话,您应该在页面开始时通过 AJAX 做锁定设置部分……与在完成部分使用 AJAX 删除它的方式相反。

浏览器非常清楚他们疯狂的 BACK/FORWARD 缓存的原因,你不能强制他们处理这个。

关于javascript - 当单击“后退”按钮查看文档时,如何强制 Web 浏览器重新加载文档?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20577431/

相关文章:

javascript - Backbone.js:无法将同一模型添加到集合中两次

javascript - 在按钮提交时触发必需的字段验证器

javascript - HTML 5 视频 : Playing multiple "clips" with javascript

php - 如何从我的站点缓存脚本和图像?

javascript - 如何读取跨度的值

javascript - 在较小的屏幕上隐藏 JavaScript

html - 当浏览器达到特定宽度时,如何使图像自行调整大小?

javascript - 在 OpenUI5 中强制清除缓存

java - "Element not found in the cache - perhaps the page has changed since it was looked up"显示

javascript - 适用于桌面和移动设备的 jQuery 事件