ChatGPT解决这个技术问题 Extra ChatGPT

window.onbeforeunload 在 iPad 上不起作用?

有谁知道 iPad 是否支持 onbeforeunload 事件和/或是否有不同的使用方式?

我几乎尝试了所有方法,似乎从未在 iPad(Safari 浏览器)上触发 onbeforeunload 事件。

具体来说,这是我尝试过的:

window.onbeforeunload = function(event) { event.returnValue = 'test'; }

window.onbeforeunload = function(event) { return 'test'; }

(以上两者加起来)

window.onbeforeunload = function(event) { alert('test')'; }

(所有上述功能,但在

所有这些都适用于 PC 上的 FF 和 Safari,但不适用于 iPad。

此外,我在加载页面后完成了以下操作:

alert('onbeforeunload' in window);
alert(typeof window.onbeforeunload);
alert(window.onbeforeunload);

结果分别是:

真的

目的

无效的

因此,浏览器确实具有该属性,但由于某种原因它没有被触发。

我尝试离开页面的方法是单击后退和前进按钮,在顶部栏中进行谷歌搜索,更改地址栏中的位置以及单击书签。

有没有人知道发生了什么?我将不胜感激任何意见。

谢谢

谢谢你们的意见。这一定是你提到的原因之一。不幸的是,Apple 没有关于此限制和其他限制的官方文档。希望他们能想出一种更有创意的方式来启用此功能,同时防止恶意使用它。我经常听到人们不小心点击离开页面并丢失了他们在表单中输入的所有数据。
您是否尝试过使用 addEventListener()
我很确定 beforeunload 在 iOS 上的 Safari 上不起作用。 :-( 也许不是您要找的东西,但我有一个关于如何reliably test for a working beforeunload的建议
2016 年 3 月 3 日,window.onbeforeunload = function(event) { event.returnValue = 'test'; } 不适用于 iOS 9.2.1 的 Chrome 和 Safari。我真的很喜欢onbeforeunload,因为如果我点击取消,页面不会改变。
似乎这个问题在 Safari 和 iOS 13 中得到了解决

D
Danger

这段 JavaScript 在 ipad 和 iphone 上的 Safari 和 Chrome 以及桌面/笔记本电脑/其他浏览器上适用于我:

var isOnIOS = navigator.userAgent.match(/iPad/i)|| navigator.userAgent.match(/iPhone/i);
var eventName = isOnIOS ? "pagehide" : "beforeunload";

window.addEventListener(eventName, function (event) { 
    window.event.cancelBubble = true; // Don't know if this works on iOS but it might!
    ...
} );

它可以捕捉到事件,但是如何弹出确认提示呢?使用类似于 op 的 return 'test'; 不起作用..
谢谢我在原始问题中错过了这一点。我没有在 iOS 上专门测试过这个,但可能添加这个额外的行会起作用:window.event.cancelBubble = true;我会添加到我的答案
谢谢,但遗憾的是它不起作用......我试图将 alert() 放入其中,似乎在触发 alert() 之前新页面已经开始加载。另请参阅:stackoverflow.com/questions/3239834/…
伙计们,您是否找到任何解决方案来在离开页面之前显示确认提示?这在除 IOS safari 之外的所有浏览器中都可以正常工作。我也尝试了 pagehide 事件,但对我不起作用。提前致谢。
我已经测试了多种解决方法,并且我很确定在 iOS 上无法显示确认提示,无论使用哪种浏览器。
D
Danny Armstrong

我发现 onunload() 事件确实会触发。它的行为有点奇怪;附加到事件的回调函数中的任何内容实际上都是在新页面在后台加载后运行的(您无法判断它是否已加载,但服务器日志记录会显示它已加载)。

更奇怪的是,如果你在 onunload() 中有一个 confirm() 调用,并且用户点击了一个链接去其他地方,那么你在做生意。但是,如果用户关闭 iPad Safari 浏览器选项卡,onunload() 事件将触发,但您的 confirm() 将隐含取消作为响应。


嗯,似乎这种确认怪癖(在确认消息之前点击第二页)不仅适用于移动 safari,而且适用于 Firefox(可能还有其他)。你简直让我大吃一惊。
弃用 unload 事件以支持 pagehide 请参阅 developer.apple.com/library/ios/documentation/AppleApplications/…
@sol0mka:就是这样,伙计!伟大的!就我而言,以下代码完成了这项工作,就我所有的浏览器和 iOS 而言: $(window).on('beforeunload pagehide', function() { // 我必须在页面上完成的工作改变 } );在我看来,这应该是公认的答案。
需要注意的是,在某些情况下,浏览器可能无法可靠地触发 unload、beforeunload 和 pagehide 事件。例如,如果移动用户通过应用管理器关闭浏览器应用,则不会触发 pagehide。来源:developer.mozilla.org/en-US/docs/Web/API/Window/pagehide_event
C
Charles Boyung

只有 Apple 肯定知道,但我的猜测是他们故意没有在移动 Safari 中启用该功能,因为它最常被阴暗的角色用来让你留在他们的网站上或弹出大量色情/广告窗口。


或者,您知道,自动保存您的更改,这样它们就不会因为您不小心点击了错误的东西而丢失。
我没有说没有有效的用途,我只是说那些是最常用的用途。
@JoelMueller 您的评论应该是公认的答案:)
@JoelMueller 这正是我的用例。呜呜@苹果
@JoelMueller 您能否分享任何官方文档,我们可以在其中解决移动 safari 自动保存更改的声明。
J
Joel Mueller

有一个带有 onbeforeunload 的 known bug in WebKit。我相信它已在 Chrome 5 的最新测试版中得到修复,但 iPad 的浏览器很可能是由没有修复的 WebKit 版本制成的。

Related Chrome bug report


我很困惑还是 iPad 浏览器上仍然存在这个错误?
J
Julien Bachmann

Mobile Safari 不支持 beforeunload 事件。您可以在此处查看所有受支持事件的列表:Handling Events Apple documentation

并且 beforeunload 不在列表中!


z
zelda.j

https://code.google.com/p/chromium/issues/detail?id=97035

见闻。

在页面关闭事件期间不再允许警报(在卸载、卸载、页面隐藏之前)。

我认为警报、提示、确认和其他类似的操作也不再被允许。


D
Dan Bray

这是一个适用于所有现代浏览器的解决方案:

var unloaded = false;
window.addEventListener("beforeunload", function(e)
{
    if (unloaded)
        return;
    unloaded = true;
    console.log("beforeUnload");
});
window.addEventListener("visibilitychange", function(e)
{
    if (document.visibilityState == 'hidden')
    {
        if (unloaded)
            return;
        unloaded = true;
        console.log("beforeUnload");
    }
});

移动浏览器往往不支持beforeunload,因为浏览器可以在不卸载页面的情况下进入后台,然后随时被操作系统杀死。

大多数桌面浏览器都包含一个错误,该错误会导致在文档卸载时不会调用 visibilityState。请参阅:here

因此,重要的是要包括这两个事件以涵盖所有场景。

注意

我在示例中使用了 console.log 而不是 alert,因为从 beforeunloadvisibilitychange 调用 alert 会被某些浏览器阻止。


M
Miquel

如果您只需要知道页面是否已离开,您可以使用 document.unload。它在 ios 浏览器中运行良好。如果您在 Apple documentation 上看到,您会发现它已被弃用,他们建议使用 document.pagehide


是的,此事件在 safari 中触发,但确认提示不像 chrome 中那样出现。