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

Posted

技术标签:

【中文标题】如何阻止用户在 Javascript 中关闭窗口?【英文标题】:How to block users from closing a window in Javascript? 【发布时间】:2011-01-14 20:31:52 【问题描述】:

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

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

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

【问题讨论】:

感谢上帝,答案是否定的。 我不希望我的窗口试图强迫我提交一些表格。杀死浏览器的进程是您无法使用 javascript 阻止的一种方式 从可用性的角度来看,如果用户出于某种原因不想填写表单并离开/关闭窗口怎么办?这不会让您网站上的用户感到沮丧并将他们赶走吗?或者更糟糕的是,输入垃圾数据只是为了让窗口关闭? 不要投反对票,因为您发现这样做的网站令人反感。提供一个建设性的替代方案,希望他能看到以其他方式做的好处。这个问题是有道理的。 @manraj82:许多现代调查系统将能够一次一页地跟踪用户的进度。如果用户在中间中止,他们可以在他们完成的最后一个阶段之后恢复。 【参考方案1】:

看看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 日起查看bug report。

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

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

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

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

【讨论】:

这在 Opera 中不起作用,因为它不会触发 onbeforeunload 事件。 opera是浏览器吗!!! 1.6%的人怎么会用! w3schools.com/browsers/browsers_stats.asp 1.6% 的人不会对询问是否要关闭窗口的对话框感到恼火?认真考虑转换为 Opera 并成为现在 1.603% 的一部分.. @FrancescoMM 您可能需要确认用户想要关闭页面的各种可能原因,以免他们意外关闭。 MDN 文档developer.mozilla.org/en-US/docs/Web/API/WindowEventHandlers/…【参考方案2】:

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

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

这对我来说很好用

【讨论】:

我已经在 IE8、Firefox 和 Chrome 上测试过,运行良好。【参考方案3】:

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

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

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

【讨论】:

首先,这种“特性”当然不应该被滥用。总是有可能,需要确认/推迟的操作是关键和/或时间敏感的。例如,网上银行。我为今天需要启动的付款提交了“账单支付”交易。我看到了一个审核/确认页面,我可以在其中EditConfirmCancel。我切换到另一个浏览器选项卡,然后无意中关闭了浏览器。我需要显示银行页面并让我知道需要确认。等到下周我再次打开 billpay 并不理想。【参考方案4】:

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

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【参考方案5】:

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

【讨论】:

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

怎么样?

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

【讨论】:

【参考方案7】:

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

不过,您可以通过在当前网页上创建 div 来实现类似的效果,以覆盖其余控件,以便您的表单是唯一可访问的东西。

【讨论】:

呃,这也很烦人。这是确保我不会再次访问网站的好方法。 这很烦人,我同意。但这比强迫我用任务管理器关闭浏览器要好。我只是关闭了烦人的标签。【参考方案8】:

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

代码取自this site。

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

【讨论】:

那么 Firefox 可能坏了。它们是唯一不是 chromum 派生的,我们网站的代码(以及我们付费使用的库)充满了特殊代码来修复内容,以便它在 Firefox 中正确显示。另外,我希望您没有对此投反对票。这个答案已有 10 年之久,当时它可能有效。

以上是关于如何阻止用户在 Javascript 中关闭窗口?的主要内容,如果未能解决你的问题,请参考以下文章

如何防止系统在 Win32 服务中关闭或重新启动?

如何在js中关闭用户浏览器选项卡/窗口[重复]

在JavaScript中关闭窗口

如何从作为wpf mvvm模式中的窗口打开的视图模型中关闭用户控件?

JavaScript 在Firefox和Internet Explorer中关闭窗口

Selenium:在javascript代码中关闭棘手的javascript弹出窗口