许多页面在您离开时都会出现警报:如果您关闭标签、未保存就离开等,则网站会出于多种原因发出警报/阻止您离开,直到您确认警报,例如“您确定要离开此页面吗?”。
这通常通过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 站点的“您所做的更改可能无法保存”警报一起工作。