【发布时间】:2010-06-25 20:24:14
【问题描述】:
我想控制人们离开我的应用的难易程度。现在,我知道我不能完全做到;这就是 cron 工作的用途。但我想尽可能多地发现病例。
我想,我可以使用onBeforeUnload 来显示对话框,警告他们离开并要求他们点击退出按钮。
但后来我发现在调用onBeforeUnload 时可以运行同步AJAX(呵呵)调用;据我了解,它同步的好处是浏览器将等待它完成后再继续。这样,我可以在服务器关闭窗口时告诉服务器我正在注销。而且因为它在onBeforeUnload 而不是onUnload,所以所有数据仍然存在,调用将被发送。
我的问题是,是否可以将这些结合起来?我想要一个弹出窗口警告他们离开,然后如果他们继续想离开,发送他们实际上要离开的消息。
按照我的理解,我做不到;我能做到:
- 只发送消息
- 只打开对话框
- 发送消息并打开对话框
...但是我不能发送消息如果他们接受了对话,对吧?我的理解是,当他们单击“确定,我想离开”时,它会立即触发onUnload,到那时为时已晚。上面的 #3 没有用,因为我不想发送他们正在注销的消息,然后让他们取消对话框并留在页面上。
我的蛋糕也可以吃吗?我可以问他们是否想离开,如果想离开,请发送消息?
【问题讨论】:
-
不要依赖
onbeforeunload来处理这些事情,它不是故障安全的:Opera 不支持这种非标准事件,因此永远不会触发。此外,使用任务管理器或其他工具(*nixkill命令)杀死浏览器也不会触发此事件。 -
正如我在文章开头所说的那样,我不打算依赖浏览器做任何事情。这就是服务器端 cron 作业的用途:捕捉不优雅的关闭。我希望尽可能地优雅地接近并捕捉尽可能多的情况。