【问题标题】:onpagehide event on iPad SafariiPad Safari 上的 onpagehide 事件
【发布时间】:2011-11-18 11:10:55
【问题描述】:

由于 iPad Safari 上的 onunload 和 onbeforeunload 事件存在一些问题,因此我发现了 iPad(页面隐藏)的等效问题,如下所示;

http://www.webkit.org/blog/516/webkit-page-cache-ii-the-unload-event/

现在我的问题是; 1. pagehide 是否等同于 unload 或 beforeunload 事件? 2.我在这个pagehide事件处理程序中使用了一个DWR调用(简单来说,它是一个AJAX调用);

someObj.saveData(jsonString,{async:false});

这里的 saveData() 实际上是一个 Java 函数,用于保存数据。 现在请...我明白在卸载事件中保存数据是一种“不好的做法”...但这已被编码到我的应用程序中,我无法更改它..

所以我的问题是它的行为究竟如何......就像它会在页面被卸载时继续在后台运行,如果是 pagehide,它会在什么时候被调用?

【问题讨论】:

    标签: java javascript ajax ipad safari


    【解决方案1】:

    beforeunloadunload 在活动页面被销毁时被触发,因为它被导航离开,或者因为浏览器正在关闭。

    pagehide 当活动页面“暂停”到例如磁盘。

    如果在页面暂停时关闭浏览器,它可能永远不会收到beforeunloadunload 事件。

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

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

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

    所以我的问题是它的行为究竟如何......就像它会在页面被卸载时继续在后台运行,如果是 pagehide,它会在什么时候被调用?

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

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

    更多细节可以在 WebKit 团队构建 pagehide 事件时的这篇博文中找到: WebKit Page Cache II – The unload Event

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-24
      • 2013-08-15
      • 1970-01-01
      • 1970-01-01
      • 2018-04-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多