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

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

许多页面在您离开时都会出现警报:如果您关闭标签、未保存就离开等,则网站会出于多种原因发出警报/阻止您离开,直到您确认警报,例如“您确定要离开此页面吗?”。

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

这里就是一个例子。

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

onbeforeunload并且onunload处理程序仍应触发;只是不应允许它们执行阻止用户的操作。这意味着没有警报,也没有需要超过几秒钟的操作。

我找到了一些插件,它们可以编辑/修补特定页面的 JavaScript,并尝试了一下它们的代码,试图让它们更普遍适用。然而,我希望找到一个解决方案,任何试图阻止用户退出的页面。

答案1

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

window.onbeforeunload = null;

这在任何地方都应该有效,除非他们真的心怀恶意,并不断重新分配它。在这种情况下,循环继续设置null可能会有效。

while(true) {
    if (window.onbeforeunload != null) {
        window.onbeforeunload = null;
    }
}

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

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

但显然,我们都知道很多页面会利用这个功能做坏事。所以如果你知道你想让它在哪些页面上工作,你可以有一个白名单系统。实际上,没有办法阻止这个操作,除非完全阻止window.onbeforeunload,以及它可能采取的任何(可能是好的)操作。

没有办法(事先不知道给定的页面代码)在停止弹出框的同时保留正确的操作。此框是不是一个alert()。该框由浏览器生成,作为 的预期行为。通过使其指定的任何函数返回字符串来onbeforeunload创建它。该字符串将打印在弹出窗口中。window.onbeforeunload

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

因此,如果不删除该功能,您将无法阻止弹出窗口。

另外,即使你找到了方法,任何 AJAX 都会失败。弹出窗口会给请求留出时间,如果没有它,数据可能会丢失。

至于onunload,它应该不可能用这个来阻止你。因为它会触发页面卸载。但为了安全起见,您可以随时执行此操作,window.onunload = null;并且应该会得到处理。

答案2

    // ==/UserScript==

var th = document.getElementsByTagName('body')[0];
var s = document.createElement('script');
s.setAttribute('type','text/javascript');
s.innerHTML = "window.onbeforeunload = function() {}";
th.appendChild(s);

答案3

有一个很好的工具可以处理 Windows 系统上任何烦人的弹出窗口 -点击关闭。您可以从这里。我检查了一下,它与 SharePoint 站点的“您所做的更改可能无法保存”警报一起工作。

相关内容