【问题标题】:pageshow event on SafariSafari 上的 pageshow 事件
【发布时间】:2015-11-19 12:41:29
【问题描述】:

我有以下简单的 JavaScript,我需要它来在页面重新加载时重新初始化一些变量,特别是当页面从 Safari BFCache 提供时:

jQuery(window).bind('pageshow', function(event) {
    // I could inspect event.originalEvent.persisted here to check for BFCache hits,
    // but it isn't required in this instance.

    // Do some initialisation here
});

假设用户遵循以下路径,导航到页面 B 和 C,然后浏览(即使用后退按钮)到页面 A:

A -> B -> A -> C -> A

pageshow 处理程序仅在第一次和第二次访问 A 时触发,即初始页面加载和第一次 BFCache 加载。因此,从本质上讲,BFCache 火灾pageshow 提供的页面似乎只有一次。

这是 Safari 上的预期行为吗?有办法解决吗?

【问题讨论】:

  • 我不明白你为什么使用pageshow。你能用$(function()){}
  • $( document ).ready()
  • 似乎有一个未解决的错误:bugs.webkit.org/show_bug.cgi?id=156356 还没有找到解决方法...
  • @GeorgiiIvankin 你找到解决方法了吗?似乎是 safari 10(和最近的 IOS)上的一个错误
  • @ErikBaan 不,很遗憾,我没有。

标签: javascript jquery safari bfcache


【解决方案1】:

我似乎通过绑定popstate 事件解决了这个问题:

jQuery(window).bind('popstate', function(event) {
    // Do some initialisation here
});

只要活动历史条目发生变化就会触发。这似乎会持续触发而不是仅触发一次,因此实现了每当用户登陆页面时执行重新初始化的目标,而不管到达那里的机制如何。

【讨论】:

  • 在 Safari 10 上对我不起作用。Popstate 事件根本不会触发。
【解决方案2】:

要禁用 BFCache,您可以在 html 正文中添加 onunload="" 属性。

<body onunload=""></body>

【讨论】:

  • 不幸的是,这不是解决此问题的方法:$(document).ready() 仅在初始 DOM 加载时触发;如果页面是从 BFCache 提供的,则不会触发。
  • 你能在你的 html 正文上添加一个onunload="" 属性吗?
  • unload 处理程序显然是doesn't necessarily fire in WebKit browsers,我也通过实验发现了这一点。
猜你喜欢
  • 1970-01-01
  • 2015-07-13
  • 2013-01-08
  • 1970-01-01
  • 2012-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
相关资源
最近更新 更多