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

时间:2010-02-09 14:56:26

标签: javascript javascript-events anti-patterns

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

伙计们,我非常感谢您的评论,我不想在任何商业网站上托管。内部事情,我们实际上让所有员工参与我们设计的这项调查.... 我知道这不是正确的方法,但我想知道我们在这里遇到的问题是否有解决方案......

8 个答案:

答案 0 :(得分:86)

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

     

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

     

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

答案 1 :(得分:8)

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

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

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

答案 2 :(得分:7)

如果您不想为所有活动显示弹出窗口,可以添加

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

这对我来说很好用

答案 3 :(得分:2)

强迫用户做一些他们不一定想做的事情是不好的做法。你不可能真的阻止他们关闭浏览器。

但是,您可以通过在当前网页上设置div来覆盖其余控件,从而获得类似的效果,这样您的表单就是唯一可访问的内容。

答案 4 :(得分:2)

这将弹出一个对话框,询问用户是否真的要关闭或留下,并留言。

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;

请注意,非常令人讨厌。如果您试图强制用户填写他们不想填写的表单,那么您将失败:他们将找到关闭窗口的方法,永远不会回到您的意思是网站。

答案 5 :(得分:2)

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

答案 6 :(得分:1)

那怎么样?

function internalHandler(e) {
    return "Please don't leave our page ever!";
}

if (window.addEventListener) {
    window.addEventListener('beforeunload', internalHandler, true);
} else if (window.attachEvent) {
    window.attachEvent('onbeforeunload', internalHandler);
}

答案 7 :(得分: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;

代码取自this site

另一方面,如果他们强制关闭(通过使用任务管理器或那些行中的某些东西),你就无法做任何事情。