使用 JavaScript 防止网页导航离开
如何使用 JavaScript 防止网页导航离开?
How to prevent a webpage from navigating away using JavaScript?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
如何使用 JavaScript 防止网页导航离开?
How to prevent a webpage from navigating away using JavaScript?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(10)
使用
onunload
允许您显示消息,但不会中断导航(因为为时已晚)。 但是,使用onbeforeunload
将中断导航:注意:会返回空字符串,因为较新的浏览器会提供一条无法覆盖的消息,例如“任何未保存的更改都将丢失”。
在旧版浏览器中,您可以指定在提示中显示的消息:
Using
onunload
allows you to display messages, but will not interrupt the navigation (because it is too late). However, usingonbeforeunload
will interrupt navigation:Note: An empty string is returned because newer browsers provide a message such as "Any unsaved changes will be lost" that cannot be overridden.
In older browsers you could specify the message to display in the prompt:
使用现代的 addEventListener API 以更现代且与浏览器兼容的方式进行等效操作。
来源:https://developer.mozilla.org/en-US/docs /Web/Events/卸载前
The equivalent in a more modern and browser compatible way, using modern addEventListener APIs.
Source: https://developer.mozilla.org/en-US/docs/Web/Events/beforeunload
与此处介绍的其他方法不同,这段代码不会导致浏览器显示警告,询问用户是否要离开; 相反,它利用 DOM 的事件性质在浏览器有机会从内存中卸载页面之前重定向回当前页面(从而取消导航)。
由于它是直接短路导航来工作的,所以不能用来防止页面关闭; 但是,它可用于禁用帧破坏。
免责声明:您绝对不应该这样做。 如果页面上有框架破坏代码,请尊重作者的意愿。
Unlike other methods presented here, this bit of code will not cause the browser to display a warning asking the user if he wants to leave; instead, it exploits the evented nature of the DOM to redirect back to the current page (and thus cancel navigation) before the browser has a chance to unload it from memory.
Since it works by short-circuiting navigation directly, it cannot be used to prevent the page from being closed; however, it can be used to disable frame-busting.
Disclaimer: You should never do this. If a page has frame-busting code on it, please respect the wishes of the author.
我最终得到了这个略有不同的版本:
在其他地方,当表单变脏时,我将脏标志设置为 true(或者我想防止导航离开)。 这使我可以轻松控制用户是否收到确认导航提示。
对于所选答案中的文本,您会看到多余的提示:
I ended up with this slightly different version:
Elsewhere I set the dirty flag to true when the form gets dirtied (or I otherwise want to prevent navigating away). This allows me to easily control whether or not the user gets the Confirm Navigation prompt.
With the text in the selected answer you see redundant prompts:
在艾曼的示例中,通过返回 false 可防止浏览器窗口/选项卡关闭。
In Ayman's example by returning false you prevent the browser window/tab from closing.
相当于 jQuery 1.11 中接受的答案:
JSFiddle 示例
altCognito 的答案使用了
unload
事件,该事件发生得太晚,JavaScript 无法中止导航。The equivalent to the accepted answer in jQuery 1.11:
JSFiddle example
altCognito's answer used the
unload
event, which happens too late for JavaScript to abort the navigation.该建议的错误消息可能会与浏览器已显示的错误消息重复。 在 Chrome 中,2 个类似的错误消息会在同一窗口中相继显示。
在 Chrome 中,自定义消息后显示的文本是:“您确定要离开此页面吗?”。 在 Firefox 中,它根本不显示我们的自定义错误消息(但仍然显示对话框)。
更合适的错误消息可能是:
或者 stackoverflow 风格:“您已经开始编写或编辑帖子。”
That suggested error message may duplicate the error message the browser already displays. In chrome, the 2 similar error messages are displayed one after another in the same window.
In chrome, the text displayed after the custom message is: "Are you sure you want to leave this page?". In firefox, it does not display our custom error message at all (but still displays the dialog).
A more appropriate error message might be:
Or stackoverflow style: "You have started writing or editing a post."
如果您遇到浏览器后退/前进按钮并且不想离开,您可以使用:
否则,您可以使用beforeunload 事件,但该消息可能会或可能不会跨浏览器工作,并且需要返回强制内置提示的内容。
If you are catching a browser back/forward button and don't want to navigate away, you can use:
Otherwise, you can use the beforeunload event, but the message may or may not work cross-browser, and requires returning something that forces a built-in prompt.
使用 onunload。
对于 jQuery,我认为它的工作方式如下:
Use onunload.
For jQuery, I think this works like so:
如果您需要在退出时将状态切换回无通知,请使用以下行:
If you need to toggle the state back to no notification on exit, use the following line: