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


12

当你离开它们时,很多页面会有警报:如果你关闭标签,导航而不保存等等,有很多原因导致网站提醒/阻止你离开,直到你确认警报为止,例如“你确定你想要离开这个页面?“

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

是一个例子。

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

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

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


你能发布一个这样做的URL吗?
golimar 2013年

编辑,补充示例。此外,我理解为什么这种行为通常是可取的,并且在许多情况下需要防止意外数据丢失。我仍然想知道如何覆盖/禁用它。
Zac B

注意:所有当前答案(修改onbeforeunload)仅适用于使用的页面onbeforeunload,而不适用于使用其他方法之一附加事件的页面。
Synetech 2014年

Answers:


7

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

window.onbeforeunload = null;

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

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

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

另一个问题是任何使用它的页面用于某些次要目的,例如通过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;件事,应该照顾好。


那种工作,但如果onbeforeunload处理程序做了其他重要的事情呢?例如,如果它是一个简短的AJAX请求,或者对本地HTML5存储提交了什么?有没有办法阻止onbeforeunload处理程序进行某些调用(即alert()),或运行超过一段时间?这就是为什么我问一个扩展而不仅仅是一个关于paintmonkey类型的脚本:似乎,为了做到这一点,在JavaScript引擎级别上必须有一些改变。
Zac B

1
我添加了一些更多信息。至于实际将其固定在较低级别,扩展实际上并不是较低级别。他们确实拥有更高的权限和一些特殊的API,但他们缺乏更改浏览器核心功能的能力。我不确定FF堵塞有多深,我没有那方面的经验。显然,作为开源,您可以进行这些更改。但是修复一个弹出窗口有点远。
泽尔

不适合我:(
Phuc Nguyen

0
    // ==/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);

1
你为什么要创建这样的脚本?
布拉德2014年

3
@anywho。如果您尝试解释脚本以帮助其他人了解他们正在做什么,这可能会有所帮助。这也可以让你回答被许多人使用,因为脚本的某个特定部分可能会以改进脚本的方式被改变,或者一个部分可能能够在完全不同的脚本中使用。无论如何,向您解释答案以帮助人们了解它如何适用于他们的问题也是一个好主意。谢谢你发布你的答案。
大卫

0

有一个很好的工具可以处理Windows系统上任何恼人的弹出窗口 - ClickOff。你可以从这里下载。我检查了它,它适用于SharePoint网站的“您所做的更改可能无法保存”警报。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.