有些网站,比如 StackExchange,会弹出一个“你确定要离开这个页面吗?” 当您在某些情况下尝试离开时出现对话框,例如如果您有尚未完成编辑的帖子。这很有帮助!
不幸的是,恶意或受感染的网站喜欢使用相同的功能说:“嘿!您还没有安装我们的恶意软件防病毒软件来解决我们绝对不会在您的计算机上发现的 111 种病毒!”和“离开这个页面”和“留在此页面上”选项被替换为“注意安全。安装我们的产品”和“用脚射击自己”。这是没有帮助的!
Javascript 可以做一些讨厌的事情。当我收到其中一个试图阻止我离开明显恶意站点的对话时,我应该如何回应?单击“离开此页面”或他们替换文本的任何内容是否安全?站点是否可以更改按钮的行为,或者拦截我的导航尝试并绘制自己的虚假对话框,当我单击它时,攻击者可以执行任何攻击者想要的操作?
gro*_*taj 25
尽管其中一些对话说了些什么,但它们不能做任何恶意的事情。您可以随时单击“确定”或“离开页面”来关闭违规页面,而不会产生任何后果。
如果对话框太长并且按钮不在屏幕上,您可以按Enter确认关闭页面。
如果您没有键盘(触摸屏设备),请使用下面的书签或查看SimpleSimon 的回答(仅限 Chrome)。
现在,一些细节。
只有一种方法可以在页面关闭时执行某些操作:通过onbeforeunload
事件。当然,这很容易对用户使用(例如,当他尝试关闭页面时,它会在新窗口中打开其副本),因此它非常有限。
实际上,您可以做的唯一合理的事情是打开一个带有自定义文本和两个按钮的对话框,一个离开页面,一个停留。页面对那个对话框唯一能做的就是定义它的文本。按钮和标题栏是不可变的。这是 Firefox 3.6 的屏幕截图:(非常旧的 Firefox 版本)
当然,当您让人们显示带有任何文本的弹出窗口和仅“确定”/“取消”按钮时,您就可以确定迟早会有人用它来对付您。
在上面的屏幕截图中,OK意味着“离开此页面”,但自定义描述暗示了更多内容。所以浏览器已经改变了对话框,所以更难让它们产生误导。例如最近版本的 Firefox 似乎忽略了自定义文本:
Chrome 显示自定义文本,但总是附加一个问题,询问用户他想做什么,按钮明确说明他们的操作:(但它仍然容易出现“猫视频”消息!)
这是 Internet Explorer 10,也是“猫型”:
Opera 12 只是忽略该onbeforeunload
事件,如果您尝试关闭这样的选项卡,它会像任何其他选项卡一样关闭。不过,我还没有测试过最新的 Opera。
所以,总结一下最重要的事情:
您可以onbeforeunload
根据需要禁用事件,有效防止页面要求您离开或留下。这是一个跨浏览器的用户脚本。(如果链接已死,请向下滚动)
如果您在显示恶意弹出窗口的特定网站上,并且您仍然害怕单击Leave,则可以创建一个书签来将其删除。右键单击您的书签栏,选择新书签(或等效项)并将其粘贴为 URL:(它只是来自上述链接的缩小代码)
javascript:var x=document.createElement('script');x.type='text/javascript';x.innerHTML='onbeforeunload=function(){};';document.body.appendChild(x);
Run Code Online (Sandbox Code Playgroud)
然后只需单击该书签,弹出窗口将从活动页面中暂时删除。
如果要测试这些弹出窗口在浏览器中的外观或测试书签/用户脚本,请使用以下代码创建一个文本文件并将其另存为.html
文件:
<html><body onbeforeunload="return 'My custom text.'">_</body></html>
Run Code Online (Sandbox Code Playgroud)
似乎用户脚本链接现在已经失效,所以这是从archive.org 缓存中提取的副本。所有功劳均归功于原始脚本创建者。
// ==UserScript==
// @name Disable - remove onbeforeunload
// @namespace
// @description Disable - remove the annoying onbeforeunload event
// @include *
// @author netvisiteurs.com
// ==/UserScript==
var x = document.createElement('script');
x.type = 'text/javascript';
x.innerHTML = 'onbeforeunload = function() {};';
document.body.appendChild(x);
Run Code Online (Sandbox Code Playgroud)
小智 10
实际上,FireFox 有一个相当漂亮(而且简单)的解决方案。如果你输入
about:config
Run Code Online (Sandbox Code Playgroud)
进入地址栏,然后向下滚动到
dom.disable_beforeunload
Run Code Online (Sandbox Code Playgroud)
并将其值设置为 True 您将不再看到离开页面弹出窗口。在火狐。太糟糕了,Chrome 中没有类似的解决方法。
小智 7
Chrome 中最简单的解决方案是使选项卡崩溃。
类型铬://碰撞到地址栏并保存为书签。
下次您想离开这样的页面时,只需单击书签,它就会立即杀死该选项卡,而不会影响您的其他选项卡。无需像其他人建议的那样终止整个浏览器会话。
或者,您可以使用chrome://hang 挂起标签,然后只需关闭标签而不运行任何 JavaScript。
不确定这在其他浏览器中是否可行。