JavaScript - bfcache/pageshow event - event.persisted always set to false?
在标准Java / SpringMVC / JSP / jQuery网络应用中,我试图检测"返回"(或history.go(-1))事件,以便刷新(AJAX)摘要组件/返回页面时的面板内容(我们可以在其中更改摘要组件显示的后端数据)。
我在JavaScript中尝试了以下操作(以下关于StackExchange的帖子介绍了如何实现此目的):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <script type="text/javascript"> $(document).ready(function() { window.onpageshow = function(event) { console.log("Event:"); console.dir(event); if (event.persisted) { alert("non-jQuery - back to page - loaded from bfcache"); } else { alert("non-jQuery - loaded page from server"); } }; $(window).on("pageshow", function(event){ console.log("Event:"); console.dir(event); if (event.originalEvent.persisted) { alert("jquery - back to page - loaded from bfcache"); } else { alert("jquery - loaded page from server"); } }); }); |
我正在运行OpenSUSE Linux,并且已经在FireFox和Chrome(最新版本)中进行了尝试,但是每次将事件的
我的意图是进行AJAX调用,以便通过返回按钮或
我还尝试设置一个卸载处理程序(不执行任何操作)以防止将该页面放入bfcache,但是它似乎仍显示bf缓存的版本,并且设置了
此属性在Linux上是否正确管理?我在代码中做蠢事吗?任何帮助或想法将不胜感激,谢谢!
我发现隐藏的输入按钮不是一个可靠的解决方案,因为当用户导航回页面然后单击刷新时,它们可能持有错误的值。有些浏览器(Firefox)会在刷新时保留输入值,因此,每当用户单击刷新时,由于输入按钮的值错误,它将再次刷新。这是论坛的典型情况(用户查看主题,单击"后退"按钮返回主题列表,并可能继续单击刷新以检查是否有新主题)。
如Gr ?? goire Clermont所述,
1 2 3 4 5 6 7 8 9 10 | if (document.addEventListener) { window.addEventListener('pageshow', function (event) { if (event.persisted || window.performance && window.performance.navigation.type == 2) { location.reload(); } }, false); } |
这似乎是Chrome中的错误(也存在于IE11中)。
我发现以下解决方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <input type="hidden" id="cacheTest"></input> var input = document.querySelector('#cacheTest') if (input.value ==="") { // the page has been loaded from the server, // equivalent of persisted == false } else { // the page has been loaded from the cache, // equivalent of persisted == true } // change the input value so that we can detect // if the page is reloaded from cache later input.value ="some value" |
这利用了以下事实:在大多数浏览器中,当从缓存加载页面时,表单字段的值也被保留。
我知道这有点晚了,但这对我有用:
1 2 3 4 5 6 7 8 | window.onpageshow = function(e) { if (e.persisted) { alert("Page shown"); window.location.reload(); } }; |
我认为您不需要在文档准备功能中使用它,只需如上所述使用vanilla。