如果OnBeforeUnload接受对话框,可以运行代码吗?

时间:2010-06-25 20:24:15

标签: javascript onbeforeunload

我想控制人们离开我的应用程序的容易程度。现在,我知道我不能完全做到;这就是cron的工作所在。但我想尽可能多地抓住案件。

我想,我可以使用onBeforeUnload来显示对话框,警告他们离开并要求他们点击退出按钮。

然后我发现在调用onBeforeUnload时可能会运行同步AJAX(heh)调用;同步的好处是浏览器会在继续之前等待它完成,据我所知。这样,我可以告诉服务器我关闭窗口时正在注销。因为它位于onBeforeUnload而不是onUnload,所有数据仍然存在并且将发送呼叫。

我的问题是,是否可以将这些结合起来?我想要一个弹出窗口警告他们离开,然后如果他们继续想离开,发送他们实际上离开的消息。

我理解它的方式,我不能这样做;我能做到:

  1. 仅发送消息
  2. 仅设置对话框
  3. 发送消息放置对话框
  4. ...但是如果他们接受了对话框,我就无法有条件地发送消息,对吧?我的理解是,当他们点击“确定,我想离开”时,会立即触发onUnload,到那时为时已晚。上面的#3没用,因为我不想发送他们正在注销的消息,然后让他们取消对话并留在页面上。

    我可以吃蛋糕吗?我可以问他们是否想要离开,如果是,请发送信息吗?

1 个答案:

答案 0 :(得分:-1)

正如我在评论中所说,onbeforeunload在Opera中不起作用。但是,我在Firefox(3.6.3 / Linux)和Chromium(5.0.375.70)中尝试了以下代码,它或多或少都有效。但是,当关闭Chromium窗口或选项卡时,会显示确认框,但即使单击Ok,窗口/选项卡也会在一秒钟内关闭。在onbeforeunload期间,同步XMLHttpRequests似乎超时。

window.onbeforeunload = function () {
    if (confirm("Send unsaved data?"))
        sendData();

};

function sendData() {
    var request = new XMLHttpRequest();
    request.open("POST", "wait.php", false); // false = synchronous request
    request.send('data={"foo":"bar"}');
    if (request.readyState == 4 && request.status == 200)
        alert("Succes!");

}

更新 - 只是为了完整起见,因为我忘了包含wait.php,它只保持连接10秒钟:

<?php sleep(10); ?>