我想控制人们离开我的应用程序的容易程度。现在,我知道我不能完全做到;这就是cron的工作所在。但我想尽可能多地抓住案件。
我想,我可以使用onBeforeUnload
来显示对话框,警告他们离开并要求他们点击退出按钮。
然后我发现在调用onBeforeUnload
时可能会运行同步AJAX(heh)调用;同步的好处是浏览器会在继续之前等待它完成,据我所知。这样,我可以告诉服务器我关闭窗口时正在注销。因为它位于onBeforeUnload
而不是onUnload
,所有数据仍然存在并且将发送呼叫。
我的问题是,是否可以将这些结合起来?我想要一个弹出窗口警告他们离开,然后如果他们继续想离开,发送他们实际上离开的消息。
我理解它的方式,我不能这样做;我能做到:
...但是如果他们接受了对话框,我就无法有条件地发送消息,对吧?我的理解是,当他们点击“确定,我想离开”时,会立即触发onUnload
,到那时为时已晚。上面的#3没用,因为我不想发送他们正在注销的消息,然后让他们取消对话并留在页面上。
我可以吃蛋糕吗?我可以问他们是否想要离开,如果是,请发送信息吗?
答案 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); ?>