【发布时间】:2011-06-15 09:58:38
【问题描述】:
我有一个 iPhone 网络应用程序,它使用缓存清单离线工作并将网络应用程序添加到我的主屏幕。我想找到一种方法来检测应用程序正在退出,这样我就可以做一些家务并保存一些数据。
如果我在 Safari 中作为网页运行,window.onunload 会为我执行此操作,但从主屏幕运行时不会发生此事件。
【问题讨论】:
标签: javascript iphone ios onunload
我有一个 iPhone 网络应用程序,它使用缓存清单离线工作并将网络应用程序添加到我的主屏幕。我想找到一种方法来检测应用程序正在退出,这样我就可以做一些家务并保存一些数据。
如果我在 Safari 中作为网页运行,window.onunload 会为我执行此操作,但从主屏幕运行时不会发生此事件。
【问题讨论】:
标签: javascript iphone ios onunload
在 iOS3 或多任务不支持的设备/应用程序中,您可以在 applicationDidTerminate 方法中做家务。
在 iOS4 和多任务支持的设备/应用程序中,您可以在 applicationDidEnterBackground 方法中做家务。最好同时实现 applicationDidTerminate 方法,以防 iOS 决定从内存中删除您的应用程序,应用程序将在您的应用程序中调用 applicationDidTerminate。
干杯。
【讨论】:
我有一个答案。这不是我们所希望的。
从http://www.w3.org/TR/DOM-Level-2-Events/events.html卸载的技术定义是:
当 DOM 发生 unload 事件时 实现从 窗户或框架。本次活动有效 用于 BODY 和 FRAMESET 元素。
我还收到了 Apple 一些知情人士的回复:“很遗憾,我无法找到在单击 Home 按钮时触发的事件!我认为最合适的事件可能是 pagehide事件。当您切换到“选项卡”视图以打开新页面时,此事件实际上会在 iOS 上的 Safari 中触发,但在您单击主屏幕图标时不会触发:-("
【讨论】:
我使用下面的代码测试了 pagehide 事件,发现它可以很好地检测用户是导航到另一个链接还是只是在 safari 中打开了一个新标签。
但是,如果您在保存到主屏幕的网络应用程序中(如您所描述的那样),则 pagehide 事件对于判断网络应用程序是否已关闭是无用的。
根据您的具体需要,您可以通过将数据保存到 localStorage 并在应用再次打开时检查 localStorage 来解决此限制。然后,您可以执行在应用程序完全启动之前可能需要完成的任何额外工作。
function myLoadHandler(evt)
{
if (evt.persisted) {
alert('user returns to page from another tab');
return;
}
alert('loading new page');
}
function myUnloadHandler(evt)
{
if (evt.persisted) {
alert('user goes to new tab');
return;
}
alert('user truly leaves the page');
}
if ("onpagehide" in window) {
window.addEventListener("pageshow", myLoadHandler, false);
window.addEventListener("pagehide", myUnloadHandler, false);
} else {
window.addEventListener("load", myLoadHandler, false);
window.addEventListener("unload", myUnloadHandler, false);
}
【讨论】: