退出时的Javascript确认框

时间:2010-10-19 11:32:51

标签: javascript redirect

我在用户出口处设置确认框时遇到了奇怪的问题。

以下是代码:

    function closeIt() {
    var message = "Click 'Cancel' right now!";

    evt=(typeof evt == 'undefined') ? window.event:evt;
    evt ? evt.returnValue = message:null;
    return message;
    }   
    window.onbeforeunload = closeIt;

我想实施哪些功能?当用户点击取消时,我想重定向页面。

我有三十多个想法,而不是他们的工作。有什么想法吗?

修改 这就是我想要的: 用户试图关闭他的浏览器标签,我想显示一个小确认框,如果他点击OK - >然后关闭标签,如果他点击取消 - >不要关闭选项卡并将用户重定向到保存页面。

我尝试了数以百万计的方法,遇到了许多问题。

5 个答案:

答案 0 :(得分:6)

  

那么......如何让用户采取行动?

你实际上不能,直接。浏览器负责显示确认,如果正常则继续导航,如果取消则不执行任何操作。您无法确定用户是否点击确定,直到您获得最终unload,此时为时已晚。

一种策略是猜测,如果用户在beforeunload后不久就在页面上,他们可能会点击取消:

var redirecting= false;
window.onbeforeunload = function() {
    if (redirecting) return;
    setTimeout(function() {
        setTimeout(function() {
            redirecting= true;
            location.href= 'http://www.example.com/';
        }, 2000);
    }, 0);
    return 'Boo hoo, please stay with me';
};

redirecting标志是停止我们自己的导航也导致beforeunload警告;双重超时是为了确保在确认框关闭后一秒钟发生超时,而不是第二次打开后。)

不幸的是,这仍然非常不可靠,因为它会执行重定向,即使用户单击确定,但是他们导航的页面开始加载的时间超过两秒。

另一种方法是始终从beforeunload提示返回任何内容,然后在0超时上设置自己的显式confirm()。但这是不可靠的跨浏览器,因为可以理解的是,浏览器并不真的想让页面像这样做一些令人讨厌的东西。它有点适用于IE,几乎适用于Firefox,只要你打破后退/前进缓存(因为这会在确认发生之前隐藏页面)。

总之,这并不是一个好的解决方案。重定向用户的用例是什么?也许您可以尝试替换当前页面的内容而不是重定向?

答案 1 :(得分:1)

这就是你想要的吗?

<script type="text/javascript">
window.onbeforeunload = function (evt) {
var message = 'Are you sure you want to leave?';
if (typeof evt == 'undefined') {
evt = window.event;
}
if (evt) {
evt.returnValue = message;
window.location = "http://www.google.com/";
}
return message;
}
</script>

您只需将google.com替换为您的网址即可。我使用google.com进行测试:)
干杯!

答案 2 :(得分:0)

为我工作confirm。由于没有发出confirm,我真诚地不明白你是如何解决它的。

window.onbeforeunload = function(){
  return confirm("Click 'Cancel' right now!");
}

答案 3 :(得分:0)

我正在使用相同类型的问题(使用Dojo v1.3)(请参阅http://jsfiddle.net/ZPxtj/19/)。

看起来像:


window.onbeforeunload = function() {
    ...
};

运作良好。

答案 4 :(得分:0)

您是否尝试在onbeforeUnload事件处理程序中启动计时器事件?只要屏幕上有模态对话框(如确认),它们通常不会触发。 (这可能取决于平台!)

当用户按下OK时,计时器可能会自动被杀死。如果没有,你需要在onunload中停止它。

如果您的计时器确实关闭,您可以在计时器事件处理程序中重定向页面。