如何在Javascript中阻止用户关闭窗口?

问题描述 投票:0回答:9

是否可以阻止用户使用退出按钮[X]关闭窗口?我实际上在页面中提供了一个关闭按钮,供用户关闭窗口。基本上我想做的是强制用户填写表单并提交。我不希望他们在提交之前关闭窗口。

我真的很感谢您的评论,我不考虑在任何商业网站上托管。这是内部的事情,我们实际上正在让所有员工参与我们设计的这项调查......

我知道这不是正确的方法,但我想知道是否有解决方案来解决我们遇到的问题......

javascript dom-events anti-patterns
9个回答
148
投票

看看

onBeforeUnload

它不会强迫某人留下来,但会提示他们询问他们是否真的想离开,这可能是您可以管理的最佳跨浏览器解决方案。 (如果您尝试留下中间答案,则类似于此网站。)

<script language="JavaScript">
    window.onbeforeunload = confirmExit;
    function confirmExit() {
        return "You have attempted to leave this page. Are you sure?";
    }
</script>

编辑:大多数浏览器不再允许

onbeforeunload
的自定义消息。

请参阅 2016 年 2 月 18 日的错误报告

onbeforeunload 对话框在现代网络上用于两件事:

  1. 防止用户无意中丢失数据。
  2. 欺骗用户。

为了限制后者的使用,同时不停止前者,我们将不显示网页提供的字符串。相反,我们将使用通用字符串。

Firefox 已经做到了这一点[...]


16
投票

如果您不想为所有事件显示弹出窗口,您可以添加条件,例如

window.onbeforeunload = confirmExit;
    function confirmExit() {
        if (isAnyTaskInProgress) {
           return "Some task is in progress. Are you sure, you want to close?";
        }
    }

这对我来说效果很好


11
投票

当用户按 ALT + F4 或从任务管理器关闭它时,您会做什么

如果他们没有在 cookie 或数据库中完成,你为什么不跟踪一下,当他们下次访问时,只需带回相同的屏幕......:顺便说一句......你还没有完成填写此表格.. .”

当然,如果您在互联网泡沫破灭之前,您会记得色情风暴,如果您关闭 1 个窗口,其他 15 个窗口就会打开。所以,是的,有代码可以检测窗口关闭,但如果您按 ALT + F4 两次,它就会打开关闭子级和父级(如果是弹出窗口)


7
投票

这将弹出一个对话框,询问用户是否确实要关闭或保留,并显示一条消息。

var message = "You have not filled out the form.";
window.onbeforeunload = function(event) {
    var e = event || window.event;
    if (e) {
        e.returnValue = message;
    }
    return message;
};

然后您可以在提交表单或执行其他操作之前取消设置

window.onbeforeunload = null;

请记住,这“非常”烦人。如果您试图强迫用户填写他们不想填写的表格,那么您将会失败:他们会找到一种方法来关闭窗口,并且永远不会回到您的网站。


5
投票

function internalHandler(e) { e.preventDefault(); // required in some browsers e.returnValue = ""; // required in some browsers return "Custom message to show to the user"; // only works in old browsers } if (window.addEventListener) { window.addEventListener('beforeunload', internalHandler, true); } else if (window.attachEvent) { window.attachEvent('onbeforeunload', internalHandler); }



4
投票


1
投票

不过,您可以通过在当前网页上制作一个

div

来实现类似的效果,将其置于其余控件之上,这样您的表单就成为唯一可访问的内容。

    


0
投票
window.onclose

事件并在事件处理程序中返回

false

function closedWin() { confirm("close ?"); return false; /* which will not allow to close the window */ } if(window.addEventListener) { window.addEventListener("close", closedWin, false); } window.onclose = closedWin;

代码取自
此网站

另一方面,如果他们强制关闭(通过使用任务管理器或这些行中的某些内容),您将无能为力。


0
投票

但是请不要这样做

使用

BroadcastChannel API

,我们实际上可以在某种程度上实现防止用户关闭选项卡的方法。 但是此方法依赖于两个条件:

用户打开页面的两个实例
  • 弹出窗口尚未被禁用
  • 本质上,通过注入此代码片段,我们可以阻止用户关闭当前页面的
所有实例

const bc = new BroadcastChannel("close-channel"); window.addEventListener("beforeunload", (e) => { bc.postMessage("close"); }); bc.addEventListener("message", (event) => { window.open(location.href, "_blank", ""); })

其工作原理是,当页面的至少两个实例打开时,如果用户尝试关闭一个实例,它会通过 
BroadcastChannel

发送一条消息,告诉另一个实例打开其自身的另一个实例。理论上不可能关闭选项卡的所有实例。

但是,这是一种极其危险的方法。

如果用户尝试关闭窗口,选项卡将无限重复并使浏览器崩溃。 解决这个问题的唯一方法是终止浏览器或禁用弹出窗口。

© www.soinside.com 2019 - 2024. All rights reserved.