JavaScript - bfcache/pageshow 事件 - event.persisted 总是设置为 false?

标签 javascript back-button pageshow

在标准的 Java/SpringMVC/JSP/jQuery 网络应用程序中,我试图检测“返回”(或 history.go(-1))事件,以便刷新(AJAX)摘要组件/当我返回页面时面板内容(我们可以在其中更改摘要组件显示的后端数据)。

我在 JavaScript 中尝试了以下方法(在 StackExchange 上的一些帖子中了解如何实现这一点):

<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");
        }
    });
});
</script>

我正在运行 OpenSUSE Linux 并在 FireFox 和 Chrome(最新版本)上尝试过,但每次事件的 persisted 属性都设置为 false(我可以看到这在 JavaScript 控制台和从上面的代码弹出的警报中)。我的意思是每次,无论它是从服务器加载还是通过“后退”按钮(或“后退”链接)再次显示。

如果页面是通过“后退”按钮或 history.go(-1) 调用显示的,我的意图是进行 AJAX 调用以使用来自服务器的更新数据重新加载摘要组件/面板.

我还尝试设置一个卸载处理程序(什么都不做)以防止页面被放入 bfcache 但它似乎仍然显示一个 bf 缓存版本和 event.persisted (或 event.originalEvent.persisted) 设置为 false

此属性在 Linux 上是否得到正确管理?我在我的代码中做了一些愚蠢的事情吗?任何帮助或想法将不胜感激,谢谢!

最佳答案

我发现隐藏的输入按钮不是一个可靠的解决方案,因为当用户导航回页面然后点击刷新时,它们可能持有错误的值。某些浏览器 (Firefox) 在刷新时保留输入值,因此每次用户点击刷新时它都会再次刷新,因为输入按钮持有错误的值。这是论坛的典型场景(用户查看一个主题,点击后退按钮返回主题列表,并可能继续点击刷新以检查是否有新主题)。

正如 Grégoire Clermont 所指出的,event.persisted 在 chrome(和 IE)中存在错误,截至 2017 年 2 月,这两种浏览器仍未修复。好消息是您可以信赖在 window.performance.navigation.type == 2 上用于 chrome 和 IE。具有讽刺意味的是,对于后者,Firefox 并不可靠,但这无关紧要,因为它对于 event.persisted 是可靠的。以下代码对我有用:

if (document.addEventListener) {
    window.addEventListener('pageshow', function (event) {
        if (event.persisted || window.performance && 
            window.performance.navigation.type == 2) 
        {
            location.reload();
        }
    },
   false);
}

2022 年更新:

因为 window.performance.navigation.type 已弃用(引用:MDN),我更新了代码来做同样的事情:

if (document.addEventListener) {
    window.addEventListener('pageshow', function (event) {
        if (event.persisted || performance.getEntriesByType("navigation")[0].type === 'back_forward') {
            location.reload();
        }
    },
    false);
}

关于JavaScript - bfcache/pageshow 事件 - event.persisted 总是设置为 false?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17432899/

相关文章:

javascript - 如何解析键盘字符并显示它们的等效图形?

android - 如何保持自动完成 TextView 为空(准备好输入)?

browser - 在浏览器上禁用“后退”按钮

javascript - PageTransitionEvent.persisted 何时评估为真?

javascript - 使用移动 safari 浏览器时如何防止从缓存中重新加载网页?

javascript - 如何让同一类的两个 div 在屏幕上移动?

javascript - requirejs 循环依赖和函数对象

android - 在 Android 中禁用后退按钮不起作用

jquery-mobile - 页面加载时的 jQuery Mobile 对话框

javascript - 自定义 jQuery 函数在 Firefox 中不起作用