卸载事件是否可以用来可靠地启动ajax请求?
我需要一种方法来监视用户编辑会话,我正在审查的解决scheme之一将使我使用unload
事件来发送一个Ajax请求通知服务器的编辑会话结束。 (请参阅: 监视用户会话以防止编辑冲突 )
我的(相当有限的)读取unload
事件表明,这个处理程序附加的代码必须快速运行,因此通常用于清除对象以防止内存泄漏。
我的问题是,这可以为此目的可靠地工作吗?
PS。 我知道关于async: false
选项。
如果你的服务器速度足够快,这个方法是相当可靠的。 有些事情要注意。 如果closures浏览器并在卸载事件中发送AJAX请求,那么很有可能在窗口对象被销毁之前,响应不会及时从服务器返回。 在这种情况下(至less在IE中)会发生什么情况,它将孤立您的连接对象,并且在连接超时命中之前不会正确终止它。 如果您的服务器没有启用连接保持活动状态,closures2个窗口(同时还有另一个窗口打开)后,您将用完打开的连接到服务器(对于IE6-7,对于IE8-6窗口)在连接超时被打中之前,您将无法打开您的网站。
我遇到了这样的情况,之前我打开一个popup窗口,发送一个AJAX请求卸载,这是非常可靠的,但它是由上述发行困扰,我花了很长的时间来跟踪它了解发生了什么事情。 之后,我做了什么,我确保打开的窗口将有相同的代码来调用服务器,并在每次卸载检查开jar器,并在那里运行的代码,如果它存在。
看来,如果closures最后一个浏览器窗口,IE将正确地销毁连接,但如果另一个窗口打开,则不会。
PS只是为了评论上面的答案,AJAX是不是真的asynchronous。 至lessJS的实现不是。 发送请求后,您的JS代码仍然会等待服务器的响应。 它不会阻止你的代码执行,但是由于服务器可能需要一段时间才能响应(或者足够长的时间来让Windows终止IE窗口对象),你可能会碰到上述问题。
你有没有尝试过使用
var i = new Image(1,1); i.src='http://...'
而只是从服务器返回一些空的图像。 我认为这应该是可靠的,脚本将阻止。 顺便说一句:很高兴添加时间戳,以防止caching。
我们有一个我们需要的情况。 这是一个需要在服务器上留下严重内存的报告页面,所以我们希望在离开页面后马上释放它。 我们创build了一个框架集,并在那里添加了卸载处理程序。 最可靠的方法是将图像的src设置为释放脚本。 我们实际上使用了unload和onbeforeunload来实现跨浏览器的兼容性。 它没有在networking工具包nightlies工作,但pipe理是确定的。
但是,这不是我提出的解决scheme。 我会使用心跳的方法,涉及更多的工作,但更强大。
你的页面应该发出定期的心跳请求。 每个请求都会设置页面的最后一次心跳。 然后,您需要一个在服务器上运行的线程,并在最后一次检测信号太早之前清除内存。
这并不能解决长时间离开页面的问题。 为此,您需要对用户活动进行一些监控,并在一段时间不活动之后离开该页面(请确保向用户确认)
您必须自己testing一下您的特定场景是否适合unload
,但是由于AJAX是asynchronous的,所以AJAX请求非常快。 你只是发送请求,然后你就完成了! (也许你必须清除刚创build的请求对象。)
如果您想validationAJAX请求是否成功了,那么您不得不担心更多/使用async:false
选项(如本讨论所示)。 但是,只是发送是一个快速的繁荣,你做的操作。
我有一个情况,我只需要通知服务器端有关卸载,并不关心响应。
如果这是你的情况,你可以ignore_user_abort ,然后你知道它会发生“可靠”