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

IT技术 javascript dom-events anti-patterns
2021-02-05 23:30:00

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

我非常感谢您的意见,我不考虑在任何商业网站上托管。这是内部的事情,我们实际上是让所有员工参与我们设计的这个调查......

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

6个回答

看看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 对话框在现代 Web 上用于两件事:
1. 防止用户无意中丢失数据。
2. 诈骗用户。

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

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

1.6% 的人不会因为询问是否要关闭窗口的对话框而烦恼?认真考虑转换为 Opera 并成为现在 1.603% 的一部分..
2021-03-19 23:30:00
这在 Opera 中不起作用,因为它不会触发 onbeforeunload 事件。
2021-03-24 23:30:00
歌剧是浏览器吗!!!!1.6%的人怎么会用!w3schools.com/browsers/browsers_stats.asp
2021-03-24 23:30:00
@FrancescoMM 有各种可能的原因,您可能想要确认用户想要关闭页面,以免他们意外关闭。
2021-03-24 23:30:00

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

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

这对我来说很好用

我已经在 IE8、Firefox 和 Chrome 上测试过它,它运行良好。
2021-03-17 23:30:00

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

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

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

首先,当然不应该滥用这种“功能”。总是有可能需要确认/推迟的操作是关键的和/或时间敏感的。例如,网上银行。我提交了一笔“账单支付”交易,用于今天需要发起的付款。我出一个审查/确认页面,在那里我可以EditConfirmCancel我切换到另一个浏览器选项卡,然后无意中关闭了浏览器。我需要显示银行页面并让我知道需要确认。等到下周我再次打开 billpay 是不理想的。
2021-03-27 23:30:00

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

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;

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

你在第 3 行有一个类型,它应该是 var e = event || window.event
2021-03-26 23:30:00

如果您发送的内部调查需要贵公司员工 100% 的参与,那么更好的方法是让表单跟踪响应者 ID/用户名/电子邮件等。每隔几天左右就发送一个不错的小通过电子邮件提醒您组织中的人员完成调查……您甚至可以自动执行此操作。

我很确定有许多预先构建的调查系统已经能够做到这一点(不确定它们是否很多,但这是另一个话题)。
2021-03-18 23:30:00
我们实际上依赖于这个预先构建的调查系统,但事实证明它是无用的......所以正在考虑一种更简单的方法,但无论如何感谢您的评论......
2021-03-26 23:30:00