编程语言
首页 > 编程语言> > javascript – 如何通过单击“返回”按钮强制Web浏览器在查看文档时重新加载文档?

javascript – 如何通过单击“返回”按钮强制Web浏览器在查看文档时重新加载文档?

作者:互联网

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

我的应用程序中的页面用于编辑数据库记录.在源文件的顶部有几行PHP来存储一个锁,表明正在编辑记录.锁存在时,其他用户无法编辑同一记录.这些页面有一个窗口卸载处理程序,它在非异步模式下使用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,由于页面注册了一个卸载监听器,浏览器不应该尝试维护页面状态.它没有!当用户按下后退按钮时,浏览器正在“重放”整个页面加载序列,包括就绪事件.它重复任何未缓存先前结果的AJAX调用.它拒绝实际从服务器重新加载的唯一东西是主文档本身.

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

解决方法:

快速回答:

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

Why is Google Chrome going to the server on pushState?

https://github.com/nickhsharp/prefetchNightmare

那说…一个GET请求(加载它的浏览器)不应该对服务器“做”任何事情……如果你应该通过页面上的AJAX开始那个锁定设置部分……如何你在完成的部分使用AJAX删除它.

浏览器非常清楚他们疯狂的BACK / FORWARD缓存的原因,你不能强迫他们动手这个.

标签:javascript,html5,browser-cache
来源: https://codeday.me/bug/20190529/1175701.html