由于iPad Safari上的onunload和onbeforeunload事件存在一些问题,我发现iPad(页面隐藏)的等效问题如上所列;
http://www.webkit.org/blog/516/webkit-page-cache-ii-the-unload-event/
现在我的问题是; 1. Pagehide是否等于卸载OR beforeload事件? 2.我在此pagehide事件处理程序中使用DWR调用(简单来说,它是一个AJAX调用);
someObj.saveData(jsonString,{async:false});
这里saveData()实际上是一个Java函数,用于保存数据。 现在请,请...我明白在卸载事件中保存数据是一个“不良实践”...但是这已被编码存在我的应用程序中,我无法改变它..
所以我的问题是它的确如何表现......就像它在页面被卸载时继续在后台运行一样,如果是页面隐藏,它会在什么时候被调用?
答案 0 :(得分:3)
beforeunload
和unload
,因为它被导航离开,或者因为浏览器正在关闭。
pagehide
被触发磁盘。
如果在网页暂停时关闭浏览器,则可能永远不会收到beforeunload
或unload
个活动。
pagehide
,因为浏览器制造商试图暂停和恢复页面缓存(而不是重新加载),但发现当他们调用unload
事件时,许多页面会采取破坏性行动这将阻止页面以后恢复。所以他们提出pagehide
作为一个类似但不同的替代方案。
我明白在卸载事件中保存数据是一个“不良做法”
我不确定...在unload
上发出同步请求是一种不好的做法,因为它会使浏览器在用户出现时等待响应试图关闭窗口...但我认为发送 - 忘记异步保存请求将没有问题。
所以我的问题是它的确如何表现......就像它在页面被卸载时继续在后台运行一样,如果是页面隐藏,它会在什么时候被调用?
从beforeunload
或unload
调用的Javascript代码通常是在关闭之前将在您的页面上运行的脚本的最后一个片段。这就是为什么,如果您需要服务器的答案,同步请求是您唯一的选择(否则永远不会处理响应)。事件完成后,页面将被销毁。 pagehide
事件类似,但页面不会被销毁,而是会被序列化并保存在某处,因此可以在以后加载和恢复。
由此可见,您不应该在pagehide
事件中执行任何“清理”逻辑,例如销毁对象等。
可以在WebKit团队构建pagehide
事件时在此博客文章中找到更多详细信息:
WebKit Page Cache II – The unload Event