iOS Safari Mobile 不会仅触发一次页面显示触发
Posted
技术标签:
【中文标题】iOS Safari Mobile 不会仅触发一次页面显示触发【英文标题】:iOS Safari Mobile doesn't trigger pageshow firing only once 【发布时间】:2015-02-16 12:55:37 【问题描述】:ios Safari 在以下情况下似乎不会触发 pageshow 事件。
假设我有 3 页
页面 A:(在 pageshow 事件中有一些代码) B 页 C页用户从A -> B
导航。按下返回按钮。 (页面显示触发良好)
用户然后导航到另一个页面可能是页面 B 或页面 C。然后再次按下后退按钮。 (页面显示不触发)
相反,如果用户再次最小化和最大化窗口或切换到另一个窗口并返回(通过在 iPhone 上按中间按钮),则再次触发 pageshow 事件。
在 android 上似乎一切正常
window.onpageshow = function(e)
alert('hello');
还有其他人遇到过吗?我在这件事上花了几个小时,却想不出解决办法。
任何帮助将不胜感激。
【问题讨论】:
也许这个***.com/questions/11979156/mobile-safari-back-button的回答对你有帮助 ***.com/questions/20899274/… 你解决了这个问题吗?我在 iOS 9.3 上遇到了同样的问题 @JorgeRamírez:是的,很久以前。我不记得了,但有两种不同的事件,一种在 Android 中运行良好,另一种在 iOS 中正常运行。一个是pageshow
,另一个我不记得了。因此,基于 UserAgent,我将我的事件句柄添加到该事件中。试试pageinit
、pagebeforeshow
、pageshow
等。
感谢您的回复,但不幸的是,我已经尝试了所有这些活动,但没有任何运气
【参考方案1】:
Hack:这对我有用
var myCustomEvent = (navigator.userAgent.match('iPhone') != null) ? 'popstate' : 'pageshow';
$(window).on(myCustomEvent, function(e)
...
由于某种原因,popstate
每次在 iOS 中页面状态发生变化时都会触发,而在 Android 中则不会。
【讨论】:
在测试了很多解决方案一段时间后,这段代码似乎终于成为了最终的解决方案,在我的情况下,它适用于 Safari 9.1 (iOS 9.3)。给面临这种情况的人的建议:一定要清除客户端上的浏览器缓存并在服务器上重新启动站点。 在 iOS 10 上像魅力一样工作!【参考方案2】:尝试使用:
window.onpageshow = function(event)
if (!event.persisted)
alert("hello");
;
Persisted 在初始页面加载时为 false,因此您可以对其进行检查,如果为 false,则为您的第一个页面加载。
【讨论】:
【参考方案3】:popstate
事件似乎不再起作用,至少对我而言。我在我的页面上制定了一些第三方脚本破坏了这一点,但无法确定是哪一个。我想出了这个技巧:
addEventListener('pageshow', () =>
history.replaceState(, document.title, window.location.pathname);
// called on initial load and first back
);
addEventListener('popstate', () =>
// called on all back events
);
【讨论】:
以上是关于iOS Safari Mobile 不会仅触发一次页面显示触发的主要内容,如果未能解决你的问题,请参考以下文章
Mobile Safari 不会触发“orientationchange”——如何调试?
为啥在 iOS Safari Mobile (iPhone / iPad) 中没有触发模糊事件?
Websql 排队执行 - iOS6 Mobile Safari
Jquery Mobile:“pageshow”事件仅在 Shift F5(完全重新加载)时触发,但在加载另一个页面或具有不同查询的同一页面时不会触发
iPhone 6+ Mobile safari iOS 8 Landscape with tabs open and Bootstrap navbar-fixed-top 在打开时不会关闭