iPad Safari上的onpagehide事件

时间:2011-09-16 07:02:13

标签: java javascript ajax ipad safari

由于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函数,用于保存数据。 现在请,请...我明白在卸载事件中保存数据是一个“不良实践”...但是这已被编码存在我的应用程序中,我无法改变它..

所以我的问题是它的确如何表现......就像它在页面被卸载时继续在后台运行一样,如果是页面隐藏,它会在什么时候被调用?

1 个答案:

答案 0 :(得分:3)

当活动页面被销毁时会触发

beforeunloadunload,因为它被导航离开,或者因为浏览器正在关闭。

当活动页面被“暂停”到例如,{p> pagehide被触发磁盘。

如果在网页暂停时关闭浏览器,则可能永远不会收到beforeunloadunload个活动。

引入了{p> pagehide,因为浏览器制造商试图暂停和恢复页面缓存(而不是重新加载),但发现当他们调用unload事件时,许多页面会采取破坏性行动这将阻止页面以后恢复。所以他们提出pagehide作为一个类似但不同的替代方案。

  

我明白在卸载事件中保存数据是一个“不良做法”

我不确定...在unload上发出同步请求是一种不好的做法,因为它会使浏览器在用户出现时等待响应试图关闭窗口...但我认为发送 - 忘记异步保存请求将没有问题。

  

所以我的问题是它的确如何表现......就像它在页面被卸载时继续在后台运行一样,如果是页面隐藏,它会在什么时候被调用?

beforeunloadunload调用的Javascript代码通常是在关闭之前将在您的页面上运行的脚本的最后一个片段。这就是为什么,如果您需要服务器的答案,同步请求是您唯一的选择(否则永远不会处理响应)。事件完成后,页面将被销毁。 pagehide事件类似,但页面不会被销毁,而是会被序列化并保存在某处,因此可以在以后加载和恢复。

由此可见,您不应该在pagehide事件中执行任何“清理”逻辑,例如销毁对象等。

可以在WebKit团队构建pagehide事件时在此博客文章中找到更多详细信息: WebKit Page Cache II – The unload Event