JavaScript退出确认框

3

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

以下是代码:

    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;

我希望实现什么功能?用户单击取消时,我想要重定向页面。
我尝试了无数次的想法,但都没有成功。有什么想法吗?
编辑 这就是我想要的: 用户试图关闭浏览器标签,我想显示一个小确认框,如果他点击确定,则关闭标签页,如果他点击取消,则不关闭标签页并将用户重定向到保存页面。
我尝试了很多方法,遇到了很多问题。

请详细解释:“当用户点击取消时,我想重定向页面”。 - user180326
或者,您可以将您的一个创意代码复制到这里,以便人们可以更好地理解您想要实现的目标。 - user180326
5个回答

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上几乎可以工作,只要你打破回退/前进缓存(因为这会隐藏确认之前的页面)。总之,没有一个好的解决方案。重定向用户的使用情况是什么?也许你可以尝试替换当前页面的内容,而不是重定向?

2

这是您想要的吗?

<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 :)
干杯!


0

对我来说使用confirm可以解决问题。我真的不明白你是如何尝试解决它的,因为没有发出confirm

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

当我使用 window.onbeforeunload = function(){ return confirm("现在点击'取消'!"); } 时,会有两次确认框弹出。真的很奇怪。 - Tom
2
onbeforeunload 的返回值是要在确认框中向用户显示的消息。不应在 onbeforeunload 中使用 confirm() - bobince
1
汤姆试图那样做,因为那是广泛采用的方式。 - Tim Down
@bobinceŁ 那么...如何获取用户操作呢?如果他点击取消,我只需要重定向用户即可。 - Tom

0

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

它看起来像:


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

工作正常。


0
你尝试过在 onbeforeUnload 事件处理程序中启动计时器事件吗?只要屏幕上有模态对话框(如确认框),它们通常不会触发。(这可能与平台有关!)
当用户按下“确定”时,计时器可能会自动停止。如果没有停止,你需要在 onunload 中停止它。
如果你的计时器确实触发了,你可以在计时器事件处理程序中重定向页面。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接