有没有办法在Mobile Safari for iOS设备上使用window.onbeforeunload?

时间:2010-11-08 20:11:29

标签: javascript iphone ios mobile-safari onbeforeunload

看起来Apple已禁用iOS设备(iPhone,iPad,iPod Touch)的window.onbeforeunload事件。遗憾的是,我找不到任何关于此事件在Mobile Safari中不起作用的文档。

有谁知道这个功能是否有可靠的替代方案? Android的浏览器似乎支持它很好,Safari桌面应用程序也支持onbeforeunload事件而没有问题。

4 个答案:

答案 0 :(得分:17)

我发现这是一个老问题,但我最近遇到了这个问题。

我正在使用window.unload,它在ios浏览器中运行良好(尽管如果你看{4}}它似乎已被弃用,他们建议使用document.pagehide

答案 1 :(得分:1)

如果你确实需要它,你就不能获得所有链接,表单和DOM对象,这些对象有一个处理程序改变了url并让它们等到你完成了你想做的事情。 对于链接,你可以通过getElementsByTagName获取它们,检查href是否以#之外的任何东西开始,只需添加onbeforeunload函数add onclick(将在查看href之前调用)。 表格相同但有onsubmit。 最后,对于使用JavaScript更改href的元素,您应该确保在添加调用onbeforeunlaod函数的lsitener时(或者,如果使用DOM0或DOM1侦听器,则可以添加一些类,然后使用全局脚本)检查具有类的所有元素,并使用闭包将其添加到事件侦听器。

但是你应该能够正常地避免使用这个事件(可能使用cookie来存储你想要每隔x秒发送一次的东西,并允许在最坏的情况下,在下次用户加载时查看它一个页面,在最好的情况下,能够在onbeforeunload或onunload上发送一个Ajax请求,即使它只发送http头,woudl也可以让你得到你想要的东西。

答案 2 :(得分:0)

基于Xavier的回答,我设计了以下解决方案:

function doStuff() {
  // here goes your logic
}

function isSafariMobile() {
  return navigator && /Safari/.test(navigator.userAgent) && /iPhone|iPad/.test(navigator.userAgent)
}

function addWatcherToLinks(baseNode) {
  if (!baseNode || !baseNode.querySelectorAll) { return; } // ignore comments, text, etc.
  for (const link of baseNode.querySelectorAll("a")) {
    link.addEventListener('click', doStuff);
  }
  for (const form of baseNode.querySelectorAll("form")) {
    form.addEventListener('submit', doStuff);
  }
}

// ...when the page loads...
// we watch the page for beforeunload to call doStuff
// Since Safari mobile does not support this, we attach a listener (watcher) to each link and form and then call doStuff.
// Also, we add such a watcher to all new incoming nodes (DOMNodeInserted).
if (isSafariMobile()) {
  addWatcherToLinks(document);
  window.addEventListener("DOMNodeInserted", (event) => { addWatcherToLinks(event.target); }, false);
} else {
  window.addEventListener('beforeunload', doStuff);
}

此解决方案有一些限制。最大的优点是它将自己附加到 all 表单和所有链接。有时这可能是不希望的。如果需要,可以跳过某些节点(例如,使用特定的data-属性标记它们)。

答案 3 :(得分:0)

我遇到了同样的问题。 iPhone中的野生动物园浏览器似乎仅触发焦点和模糊事件,而几乎未触发其他所有事件,例如(页面隐藏,页面显示,可见性更改),但好消息是在iPhone,iPad和Android手机上支持并触发了焦点和模糊事件也是

    window.addEventListener('focus', function(){
       // do stuff
     });

   window.addEventListener('blur', function(){
       // do stuff
     });

希望这对任何人都有帮助。