4

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

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

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

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

按照我的理解,我不能这样做;我可以:

  1. 只发送消息
  2. 只打开对话框
  3. 发送消息打开对话框

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

我可以把我的蛋糕也吃掉吗?我可以问他们是否想离开,如果愿意,发送消息吗?

4

1 回答 1

-1

正如我在评论中所述,onbeforeunload在 Opera 中不起作用。但是,我在 Firefox (3.6.3/Linux) 和 Chromium (5.0.375.70) 中尝试了以下代码,它或多或少地工作。但是,当关闭 Chromium 窗口或选项卡时,会显示确认框,但会在一秒钟内关闭窗口/选项卡,即使单击 也是如此Ok。在onbeforeunload.

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); ?>
于 2010-06-25T21:37:33.653 回答