防止缓存 iPhone Web 应用程序重新加载(滚动到顶部)

Posted

技术标签:

【中文标题】防止缓存 iPhone Web 应用程序重新加载(滚动到顶部)【英文标题】:Prevent cached iPhone webapp from reloading (scrolling to top) 【发布时间】:2011-03-18 01:37:22 【问题描述】:

我有一个使用缓存清单离线工作的 iPhone 网络应用。我将 webapp 添加到我的主屏幕,使用它(比如滚动到页面上的某个位置),然后返回主屏幕。 当我再次打开该应用程序时,我看到了我曾经所在的位置(在该页面上的滚动位置),但随后应用程序“重新加载”并且我被滚动到主页的顶部。有没有办法防止这种“重新加载”?即使在飞行模式下也会发生这种情况(即一切都在缓存中工作)。

【问题讨论】:

这在普通的 Safari 应用程序中总是困扰着我,它总是试图重新加载上一页...... 【参考方案1】:

您看到的只是默认启动图像,它只是您上次所在位置的屏幕截图。这不是“重新加载”;应用开始时未加载。

搜索“apple-touch-startup-image”设置真实加载图片。

【讨论】:

啊,所以我离开应用程序的状态被记住了是错觉吗?没有机会在关闭之前实际存储滚动位置? 你也许可以自己把它保存到localStorage:当你开始滚动时,重置一个250ms的计时器;当计时器到期时,保存滚动位置,可能是相对于最近的锚点以考虑页面变化。在加载时恢复它。仅当 window.navigator.standalone 为 true 时才执行这些操作。【参考方案2】:

我在这里苦苦挣扎的是,如果我使用常规 Safari 而不是在“apple-mobile-web-app-capable”模式下运行,该应用程序实际上似乎会在“内存中”停留更长时间。在后一种情况下,只需按下主页按钮,然后将任务切换回应用程序就会导致重新加载。在 Safari 中做同样的事情通常不会重新加载。所以我使用“apple-mobile-web-app-capable”会更糟。

【讨论】:

【参考方案3】:

我不相信有真正的“重新加载”事件。我们只需要 onload 和 onunload。

onload 处理程序启动时就像您第一次访问该页面一样。

onunload 处理程序是清除旧内容的关键。

我喜欢为重新使用我的网络应用程序的人提供替代内容。

window.onunload=function()
  document.getElementsByTagName('body')[0].className+=' unloading'

让 CSS 做一些脏活来隐藏大部分正文并显示替代内容。

(这个答案不依赖jQuery或其他框架)

【讨论】:

【参考方案4】:

// 加载中

window.scroll(0,0);

为了确保在启动时不显示旧内容,我在我的页面中使用了这个:

window.addEventListener('unload', function() $('body').hide(); );

因此页面的最后一个状态是空的,当页面再次打开时显示给用户。

【讨论】:

确保应用程序使用缓存清单中的最新文件也是一个好主意:window.applicationCache.addEventListener('updateready', function() window.applicationCache.swapCache(); window. location.reload(true); , false);

以上是关于防止缓存 iPhone Web 应用程序重新加载(滚动到顶部)的主要内容,如果未能解决你的问题,请参考以下文章

缓存来自 iPhone 的 PHP Web 服务的结果

iPhone Web App Div 标签在 Safari 中重新加载

当我选择操作栏返回时冻结或制作稳定的 Web 视图?防止每次加载/重新加载

iPhone Web App 闪屏延迟

防止 iframe 内容在 firefox 中隐藏时重新加载

是否可以缓存/归档整个 Web 文档(包括 DOM 的精确状态)并在以后重新加载?