如何确保在页面卸载前始终调用代码

如何确保在页面卸载前始终调用代码

问题描述:

通常这并不重要,对我的情况来说甚至可能不是太重要,但我想知道是否有合理的方法来实现此目的。如何确保在页面卸载前始终调用代码

我的页面自动打开一个web套接字连接。为了成为一个更好的客户端,我希望客户端自己清理并关闭websocket,然后卸载页面。

我希望浏览器能在页面卸载时给我打电话close(),但如果没有,我该如何利用onbeforeunload消息(或其他)做一些“final清理“(与C中的atexit()不同)?

假设我有一些系统,我希望我的客户端因某种原因发送“退出”消息到我的websocket服务器。之前的socket.onclose回调火灾实际卸载页面

$(window).on('beforeunload', function() { 
    websocket.close(); // websocket is a WebSocket 
}); 

但假设close()实际上是一个异步调用(是吗?),我想确保:

我现在可以做到这一点!这可以做到吗?

+0

如果您控制服务器,您可以每n分钟需要一次客户端心跳 - 如果服务器未收到心跳,服务器将关闭套接字以清理浏览器可能留下的任何孤立客户端套接字周围。 – jfriend00 2012-08-07 19:30:12

+0

@ jfriend00这听起来像是一个完美的方法来处理这个问题。它也似乎是'onbeforeunload'中的'close()'做的。 – 2012-08-07 19:51:23

+0

我认为你不能指望在所有浏览器中工作的'close()',但是在那里尝试它并没有什么坏处。心跳包括所有情况,甚至包括通知您窗口关闭的浏览器错误。 – jfriend00 2012-08-07 20:26:17

确定在现代浏览器中完全执行异步调用没有确定的方法。旧版本可能会暂停一段时间,但目前的浏览器会杀死任何进程并继续。理由是他们希望用户体验更快,你坚持他们会伤害他们。

+0

是做一个繁忙的循环来阻止卸载不是一个合适的解决方案。 – 2012-08-07 19:11:57

+1

@StevenLu它曾经是唯一的解决方案。 :) – epascarello 2012-08-07 19:35:43

window.onunload=function(){ 
//your code here 
} 

我想我们确实有这个。

+0

这应该足够非异步的东西,但要验证我的'websocket.onclose'已经运行(这是异步),这是不够的。也许没有解决办法。 – 2012-08-07 19:13:44