如何防止在离开页面时触发 JavaScript 警报?

Zac*_*c B 13 google-chrome javascript

许多页面在您离开时都会发出警报:如果您关闭标签页、在没有保存的情况下离开等等,有很多原因会导致站点在您确认警报之前提醒/阻止您离开,例如“您确定要离开此页面?”。

这通常是通过onbeforeunload和/或onunload处理程序完成的。

是一个例子。

有什么方法可以阻止这些处理程序生成的警报/用户阻止事件?基本上,我想启用 JS,并特别禁止那些会阻止我在没有额外点击的情况下离开页面的事情。

onbeforeunloadonunload处理器仍然应该火; 他们只是不应该被允许做阻止用户的事情。这意味着没有警报,也没有需要超过几秒钟的操作。

我发现了一些插件可以编辑/greasemonkey 修补特定页面的 javascript,并尝试使用它们的代码来尝试使它们更普遍适用。但是,我希望找到一种适用于任何试图阻止用户退出的页面的解决方案。

zee*_*eel 7

好吧,最简单的方法就是直接覆盖 pages 脚本,然后将事件重新分配给null.

window.onbeforeunload = null;
Run Code Online (Sandbox Code Playgroud)

这应该在任何地方都有效,除非他们真的是恶意的,并不断自己重新分配。在这种情况下,保持设置的循环null可能会起作用。

while(true) {
    if (window.onbeforeunload != null) {
        window.onbeforeunload = null;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,请注意,有些页面会很好地使用它。以 YouTube 上传页面为例:如果您在上传过程中离开,您可能会丢失数小时的进度!或者可能是您正在填写的网络表单,您可能不想再次填写,或者您可能不想重新输入的消息(论坛/电子邮件)。使用此功能,您将受到保护。

另一个问题是任何页面将其用于某些次要目的,例如通过 AJAX 保存数据。他们可能会使用此事件来触发保存操作,并希望用户花费足够长的时间来单击按钮以使请求通过。同样,这样做通常是为了让您远离自己。

但是,显然,我们都知道很多页面都使用它来治疗疾病。因此,如果您知道要处理的任何页面,则始终可以拥有一个白名单系统。真的没有办法阻止这个动作,没有完全阻止window.onbeforeunload,以及它可能采取的任何(可能是好的)动作。

没有办法(没有给定页面代码的先验知识)在停止弹出框的同时保持良好的动作。这个盒子是不是一个alert()。该框由浏览器生成,作为onbeforeunload. 人们通过使他们分配的任何函数window.onbeforeunload返回一个字符串来创建它。该字符串将打印在弹出窗口中。

window.onbeforeunload = function() {
    //Whatever
    return "WARNING! You have unsaved changes that may be lost!";
}
Run Code Online (Sandbox Code Playgroud)

因此,您将无法在不删除该功能的情况下阻止弹出窗口。

另外,如果您确实找到了方法,任何 AJAX 都会失败。弹出窗口让请求有时间通过​​,没有它,数据可能会丢失。

至于onunload,应该不可能用这个来阻止你。因为它页面卸载触发。但为了安全起见,你总是可以做一个window.onunload = null;,它应该得到照顾。