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

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

我真的很感谢你的意见,我没有考虑在任何商业网站主机。这是一个内部的事情,我们实际上让所有的工作人员参与这个调查,我们已经设计..。

我知道这不是正确的方式,但我想知道是否有一个解决问题的办法,我们已经在这里..。

137392 次浏览

您可以使用 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;

代码取自 这个网站

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

当用户点击 ALT + F4或者从任务管理器关闭它时,你会做什么

你为什么不跟踪,如果他们没有完成它在一个 cookie 或数据库,当他们访问下次只是带来相同的屏幕回来... : 顺便说一句。.你还没有填完这张表...”

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

强迫用户做一些他们不一定想做的事情是很糟糕的做法。你永远无法阻止他们关闭浏览器。

你可以实现类似的效果,但是,通过使一个 div在您当前的网页,以层顶的其余控件,所以您的形式是唯一的事情访问。

看看 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日的 漏洞报告

Onbefore 卸载对话框在现代网络上有两种用途:

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

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

Firefox 已经这样做了[ ... ]

这将弹出一个对话框,询问用户是否真的希望关闭或停留,并附带一条消息。

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

然后,您可以在提交表单或其他内容之前取消设置

window.onbeforeunload = null;

请记住,这是 非常恼人。如果你试图强迫你的用户填写一个表格 他们不想填,那么你将失败: 他们会找到一个方法来关闭窗口,永远不会回到你的意思是网站。

如果你发送的内部调查需要公司员工100% 的参与,那么一个更好的方法就是让表格记录回复者的 ID/用户名/电子邮件等。每隔几天左右就给你的组织里的人发一封邮件,提醒他们完成调查... ... 你甚至可以自动完成这项工作。

怎么样?

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);
}

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

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

这对我来说没问题