我有一个 iPhone webapp,它使用缓存清单离线工作并将 webapp 添加到我的主屏幕。我想找到一种检测应用程序正在退出的方法,这样我就可以做一些家务并保存一些数据。
如果我在 Safari 中作为网页运行,window.onunload 会为我执行此操作,但从主屏幕运行时不会发生此事件。
我有一个 iPhone webapp,它使用缓存清单离线工作并将 webapp 添加到我的主屏幕。我想找到一种检测应用程序正在退出的方法,这样我就可以做一些家务并保存一些数据。
如果我在 Safari 中作为网页运行,window.onunload 会为我执行此操作,但从主屏幕运行时不会发生此事件。
我使用下面的代码测试了 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);
}
我有一个答案。这不是我们所希望的。
从http://www.w3.org/TR/DOM-Level-2-Events/events.html卸载的技术定义是:
当 DOM 实现从窗口或框架中删除文档时,会发生 unload 事件。此事件对 BODY 和 FRAMESET 元素有效。
我还收到了 Apple 一些知情人士的回复:“不幸的是,我无法找到在单击 Home 按钮时触发的事件!我认为最合适的事件可能是 pagehide 事件。这个当您切换到“选项卡”视图以打开新页面时,事件实际上会在 iOS 上的 Safari 中触发,但在您单击主屏幕图标时不会触发:-("
在 iOS3 或多任务不支持的设备/应用程序中,您可以在 applicationDidTerminate 方法中做家务。
在 iOS4 和多任务支持的设备/应用程序中,您可以在 applicationDidEnterBackground 方法中做家务。最好同时实现 applicationDidTerminate 方法,以防 iOS 决定从内存中删除您的应用程序,应用程序将在您的应用程序中调用 applicationDidTerminate。
干杯。