window.onbeforeunload 在 iPad 上不起作用?
有谁知道 iPad 上是否支持 onbeforeunload
事件和/或是否有不同的使用方式?
我已经尝试了几乎所有方法,但似乎 onbeforeunload
事件从未在 iPad(Safari 浏览器)上触发。
具体来说,这是我尝试过的:
- 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);
分别,结果是:
true
object
null
所以,浏览器确实有属性,但由于某种原因它没有被解雇,
我尝试离开页面的方法是单击后退和前进按钮,在顶部栏中进行谷歌搜索,通过更改地址栏中的位置。 ,并单击书签。
有人知道发生了什么吗?我将不胜感激
。
Does anyone know if the onbeforeunload
event is supported on the iPad and/or if there's a different way to use it?
I've tried pretty much everything, and it seems like the onbeforeunload
event is never triggered on the iPad (Safari browser).
Specifically, this is what I've tried:
window.onbeforeunload = function(event) { event.returnValue = 'test'; }
window.onbeforeunload = function(event) { return 'test'; }
- (both of the above together)
window.onbeforeunload = function(event) { alert('test')'; }
- (all of the above functions but inside
<body onbeforeunload="...">
All of these work on FF and Safari on the PC, but not on the iPad.
Also, I've done the following just after loading the page:
alert('onbeforeunload' in window);
alert(typeof window.onbeforeunload);
alert(window.onbeforeunload);
Respectively, the results are:
true
object
null
So, the browser does have the property, but for some reason it doesn't get fired.
The ways I try to navigate away from the page are by clicking the back and forward buttons, by doing a google search in the top bar, by changing location in the address bar, and by clicking on a bookmark.
Does anyone have any idea about what's going on? I'd greatly appreciate any input.
Thanks
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
这段 JavaScript 对我来说适用于 iPad 和 iPhone 上的 Safari 和 Chrome,以及台式机/笔记本电脑/其他浏览器:
This bit of JavaScript works for me on Safari and Chrome on ipad and iphone, as well as desktop/laptop/other browsers:
我发现 onunload() 事件确实触发了。它的行为有点奇怪;附加到事件的回调函数中的任何内容实际上都是在新页面在后台加载后运行(您无法判断它已加载,但服务器日志记录将显示它已加载)。
更奇怪的是,如果您在 onunload() 中调用了 inform() ,并且用户单击了链接前往其他地方,那么您就可以正常工作了。但是,如果用户关闭 iPad Safari 浏览器选项卡,则会触发 onunload() 事件,但您的 inform() 将会有一个隐式取消作为响应。
I have found that the onunload() event does fire. It's behavior is somewhat odd; whatever you have in your callback function attached to the event is actually run after the new page has loaded in the background (You can't tell it's loaded yet, but server logging will show that it has).
More oddly, if you have a confirm() call in your onunload(), and the user has clicked a link to go somewhere else, you are in business. If, however, the user closes the iPad Safari browser tab, the onunload() event will fire, but your confirm() will have an implicit cancel as response.
只有苹果公司会确切知道,但我的猜测是,他们故意没有在移动 Safari 中启用该功能,因为它最常被可疑人物用来让你留在他们的网站上或弹出大量色情/广告窗口。
Only Apple would know for sure, but my guess is that they purposely did not enable that functionality in mobile Safari because it is most often used by shady characters to get you to stay on their site or pop up lots of porn/advertising windows.
Mobile Safari 不支持 beforeunload 事件。您可以在此处查看所有支持的事件的列表: 处理事件苹果文档
并且 beforeunload 不在列表中!
beforeunload event is not supported by Mobile Safari. You can see the list of all supported events here: Handling Events Apple documentation
And the beforeunload is not in the list!
onbeforeunload 中存在 WebKit 中的已知错误。我相信它在最新的 Chrome 5 测试版中已得到修复,但 iPad 的浏览器很可能是由没有修复的 WebKit 版本制成的。
相关 Chrome 错误报告。
There's a known bug in WebKit with onbeforeunload. I believe it's fixed in the latest beta of Chrome 5, but it's quite possible the iPad's browser is made from a version of WebKit that doesn't have the fix.
Related Chrome bug report.
这是一个适用于所有现代浏览器的解决方案:
移动浏览器往往不支持
beforeunload
因为浏览器可以在不卸载页面的情况下进入后台,然后随时被操作系统杀死时间。大多数桌面浏览器都包含一个错误,该错误会导致文档卸载时无法调用
visibilityState
。请参阅:此处。因此,包含这两个事件以涵盖所有场景非常重要。
NB
在我的示例中,我使用了
console.log
而不是alert
,因为alert
会被某些浏览器阻止从beforeunload
或visibilitychange
调用。Here's a solution that should work on all modern browsers:
Mobile browsers don't tend to not support
beforeunload
because the browser can go into the background without unloading the page, then be killed by the operating system at any time.Most desktop browser contain a bug that causes
visibilityState
to not get called when the document unloads. See: here.Therefore, it's important to include both events to cover all scenarios.
NB
I have used
console.log
instead ofalert
in my example becausealert
will get blocked by some browsers when called frombeforeunload
orvisibilitychange
.https://code.google.com/p/chromium/issues/detail ?id=97035
见闻。
我认为警报、提示、确认和其他类似的操作也不再被允许。
https://code.google.com/p/chromium/issues/detail?id=97035
see hear.
I think alerts, prompt, confirm, and other actions like these are also no longer allowed.
如果您只需要知道页面是否已离开,可以使用
document.unload
。在ios浏览器中运行良好。如果您看到 Apple 文档 你会发现它已被弃用,他们建议使用 document.pagehideIf you just need to know if the page has been left you can use
document.unload
. It works fine in ios browsers. If you see on Apple documentation you'll find that it's deprecated and they recommend to use document.pagehide