【问题标题】:Can OnBeforeUnload run code if they accept the dialog?如果他们接受对话框,On​​BeforeUnload 可以运行代码吗?
【发布时间】:2010-06-25 20:24:14
【问题描述】:

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

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

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

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

按照我的理解,我做不到;我能做到:

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

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

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

【问题讨论】:

  • 不要依赖onbeforeunload 来处理这些事情,它不是故障安全的:Opera 不支持这种非标准事件,因此永远不会触发。此外,使用任务管理器或其他工具(*nix kill 命令)杀死浏览器也不会触发此事件。
  • 正如我在文章开头所说的那样,我不打算依赖浏览器做任何事情。这就是服务器端 cron 作业的用途:捕捉不优雅的关闭。我希望尽可能地优雅地接近并捕捉尽可能多的情况。

标签: javascript onbeforeunload


【解决方案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); ?>

【讨论】:

  • 无论如何,这可能只会在 FF 和 IE 中使用,我不会特意支持 Opera 和 Chrome(它是一个内部应用程序)。但这听起来还是有点粗略。根据我所看到的,我想我宁愿用cron 扔掉我的很多东西。 (再说一次,并不是说它不会存在无论如何,我只是想看看我可以多么优雅地关闭应用程序。似乎不要太多。)
  • @Andrew:确实。只是网络不是为做这些事情而设计的。
猜你喜欢
  • 2021-08-04
  • 1970-01-01
  • 1970-01-01
  • 2012-08-13
  • 2018-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多