iOS Safari Mobile 不会仅触发一次页面显示

iOS Safari Mobile doesn't trigger pageshow firing only once

iOS Safari 在以下情况下似乎不会触发 pageshow 事件。

假设我有 3 页

用户从 A -> B 开始导航。按下后退按钮。 (pageshow 触发良好)
然后用户导航到另一个页面,可能是页面 B 或页面 C。然后再次按下后退按钮。 (页面显示不触发)

相反,如果用户再次最小化和最大化 window 或切换到另一个 window 并返回(通过在 iPhone 上按中间按钮),将触发 pageshow 事件再次.

在 Android

上似乎一切正常

window.onpageshow = function(e) {
  alert('hello');
}

还有人遇到过吗?我在这件事上花了几个小时,想不出解决方法。

如有任何帮助,我们将不胜感激。

尝试使用:

window.onpageshow = function(event) {
if (!event.persisted) {
    alert("hello");
}
};

Persisted 在初始页面加载时为 false,因此您可以对照它进行检查,如果为 false,则这是您的第一个页面加载。

技巧:这对我有用

var myCustomEvent = (navigator.userAgent.match('iPhone') != null) ? 'popstate' : 'pageshow';

$(window).on(myCustomEvent, function(e) {
 ...
}

由于某些原因 popstate 每次当页面状态在 iOS 中发生变化但在 Android 中没有变化时触发。

popstate 活动似乎不再有效,至少对我而言。我在我的页面上制定了一些第三方脚本来打破这一点,但无法确定是哪一个。我想出了这个技巧:

addEventListener('pageshow', () => {
  history.replaceState({}, document.title, window.location.pathname);
  // called on initial load and first back
});

addEventListener('popstate', () => {
  // called on all back events
});