是否可以阻止用户使用退出按钮[X]关闭窗口?我实际上在页面中提供了一个关闭按钮,供用户关闭窗口。基本上我想做的是强制用户填写表单并提交。我不希望他们在提交之前关闭窗口。
我真的很感谢您的评论,我不考虑在任何商业网站上托管。这是内部的事情,我们实际上正在让所有员工参与我们设计的这项调查......
我知道这不是正确的方法,但我想知道是否有解决方案来解决我们遇到的问题......
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 对话框在现代网络上用于两件事:
为了限制后者的使用,同时不停止前者,我们将不显示网页提供的字符串。相反,我们将使用通用字符串。
Firefox 已经做到了这一点[...]
如果您不想为所有事件显示弹出窗口,您可以添加条件,例如
window.onbeforeunload = confirmExit;
function confirmExit() {
if (isAnyTaskInProgress) {
return "Some task is in progress. Are you sure, you want to close?";
}
}
这对我来说效果很好
当用户按 ALT + F4 或从任务管理器关闭它时,您会做什么
如果他们没有在 cookie 或数据库中完成,你为什么不跟踪一下,当他们下次访问时,只需带回相同的屏幕......:顺便说一句......你还没有完成填写此表格.. .”
当然,如果您在互联网泡沫破灭之前,您会记得色情风暴,如果您关闭 1 个窗口,其他 15 个窗口就会打开。所以,是的,有代码可以检测窗口关闭,但如果您按 ALT + F4 两次,它就会打开关闭子级和父级(如果是弹出窗口)
这将弹出一个对话框,询问用户是否确实要关闭或保留,并显示一条消息。
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;
请记住,这“非常”烦人。如果您试图强迫用户填写他们不想填写的表格,那么您将会失败:他们会找到一种方法来关闭窗口,并且永远不会回到您的网站。
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);
}
不过,您可以通过在当前网页上制作一个
div
来实现类似的效果,将其置于其余控件之上,这样您的表单就成为唯一可访问的内容。
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;
代码取自此网站
。 另一方面,如果他们强制关闭(通过使用任务管理器或这些行中的某些内容),您将无能为力。
使用
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
发送一条消息,告诉另一个实例打开其自身的另一个实例。理论上不可能关闭选项卡的所有实例。
但是,这是一种极其危险的方法。如果用户尝试关闭窗口,选项卡将无限重复并使浏览器崩溃。 解决这个问题的唯一方法是终止浏览器或禁用弹出窗口。