0 0

浏览器关闭页面处理10

开发中遇到问题:业务希望关闭浏览器后后台能够得到用户已经离开系统操作消息,因为这个消息将会触发在其他业务系统中功能,所以在实时性上有要求。

需求分析:

1:js通过绑定onbeforeunload事件在触发时候调用ajax发送请求到服务器,但是实际上页面对象已经释放了,那么在ajax还没有发送成功时候变被终止了。
window.onbeforeunload = function(){
      $.ajax('',{});
}

2:现在做法是通过ajax方式定时发送请求到服务器,但是在多用户情况下这样会给服务器压力。
setInterval(function(){
      $.ajax('',{});
},30000);

是否还有其他方式能更好解决这个问题?
问题补充
还有其他方式能更好解决这个问题?
问题补充
现在问题就是需要在用户点击了确认后才能发送ajax请求
问题补充
如果用onunload事件处理肯定是不可以
问题补充
用定时轮询的方式算是一种方案,虽然有时间延迟,有后台每隔一点事件去判断用户的离开
问题补充
int08h 写道
把ajax改成同步的就是了,问题就是连接慢的话页面会有假死现象

那就是说在onunload事件处理ajax改成同步发送请求?
问题补充
如果是onunload事件中处理,但是此时页面dom已经销毁了,那么ajax方法也会销毁了
问题补充
zjhlht 写道
这个问题原来也遇见过,一直没有很好的解决,而且还有个大问题是跨浏览器的问题,头大啊,希望LZ最后能总结出来的。给点经验

跨浏览器的问题,头大啊!
问题补充
zjhlht 写道
这个问题原来也遇见过,一直没有很好的解决,而且还有个大问题是跨浏览器的问题,头大啊,希望LZ最后能总结出来的。给点经验

是否可以考虑WebSocket方式建立连接来监听用户使用浏览器状态?
问题补充
jinxhj2003 写道
这个问题我们现在的项目也有这种需求,通过你说的用js的方式,,用户关闭浏览器就执行ajax。。但这只是一种情况,如果是客户端直接关电脑或是直接通过任务管理器关进程。那种方式的效果不太好的。。甚至不执行..
我们现在的解决方案是监听session。。将用户的登陆状态保存至数据库。。然后服务器每隔一定时间查看当前的session同步至数据库。。

这种方式处理比较合适些。

问题补充
现在就是无法做到实时,所以只能采取服务端监控客户端定时发送ajax请求处理办法,如果在指定时间内没有得到浏览器发送请求,则认为用户离开了页面。
2011年4月15日 14:21

19个答案 按时间排序 按投票排序

0 0

window.onbeforeunload不用异步用同步怎么样?

2011年4月16日 09:34
0 0

3楼正解,弹出提示用alert.
先ajax请求,然后立马alert.
alert会阻塞javascript执行器中当前主线程的执行,但ajax启动的线程不是主线程,仍在执行。当用户点完确定后,ajax在后台早执行完了。

2011年4月15日 14:21
0 0

      window.onbeforeunload = function() {
         window.location = "exit.action";
      }

2011年4月15日 14:21
0 0

deng131 写道
现在就是无法做到实时,所以只能采取服务端监控客户端定时发送ajax请求处理办法,如果在指定时间内没有得到浏览器发送请求,则认为用户离开了页面。


这样是不是太耗资源了啊,服务器压力太大了

2011年4月15日 14:21
0 0

主要看楼主对用户离开这个事件的实时性要求有多高。
如果实时性要求不高,用http session超时机制不依赖客户端,是比较可靠的方式
反之,就得采用诸如浏览器unload或者轮询的方式

2011年4月15日 14:21
0 0

记得之前遇到过这种情况,当时是在unload(beforeunload没有返回值,至于哪个事件记得不太清了)事件中做的同步处理,发送离线标示到服务器上。在正常情况下都可以的。

2011年4月15日 14:21
0 0

jinxhj2003 写道
这个问题我们现在的项目也有这种需求,通过你说的用js的方式,,用户关闭浏览器就执行ajax。。但这只是一种情况,如果是客户端直接关电脑或是直接通过任务管理器关进程。那种方式的效果不太好的。。甚至不执行..
我们现在的解决方案是监听session。。将用户的登陆状态保存至数据库。。然后服务器每隔一定时间查看当前的session同步至数据库。。


这种是通用点的解决方案吧。。。在客户端的处理的话 总会有以外情况。。。断电、断网、直接关进程等一堆要考虑的 还不如直接服务器端做这种事情。。

2011年4月15日 14:21
0 0

可以试试通过监听session的Attribute。

2011年4月15日 14:21
0 0

浏览器崩溃,
用户直接结束进程
都是问题

2011年4月15日 14:21
0 0

function ajaxget (){
//ajax请求 在回调函数中判断是否发送失败,如果失败的话 则继续 ajaxget()一下
}

2011年4月15日 14:21
0 0

还是楼上这种方式好一点,听说浏览器可以长连接,但我没试过,而且跨浏览器问题也麻烦。

服务端监听会导致用户把浏览器开长时间不动作,使服务器以为用户下线,可以在cookie中设置自动登陆,注意安全性。

2011年4月15日 14:21
0 0

这个问题我们现在的项目也有这种需求,通过你说的用js的方式,,用户关闭浏览器就执行ajax。。但这只是一种情况,如果是客户端直接关电脑或是直接通过任务管理器关进程。那种方式的效果不太好的。。甚至不执行..
我们现在的解决方案是监听session。。将用户的登陆状态保存至数据库。。然后服务器每隔一定时间查看当前的session同步至数据库。。

2011年4月15日 14:21
0 0

可以新开窗口,window.open(requestURL) 变通完成用户登出处理

2011年4月15日 14:21
0 0

这个问题原来也遇见过,一直没有很好的解决,而且还有个大问题是跨浏览器的问题,头大啊,希望LZ最后能总结出来的。给点经验

2011年4月15日 14:21
0 0

还是在服务器端监控session超时吧
这样发送Ajax请求,不确定性太高

2011年4月15日 14:21
0 0

其实。。。轮询也没什么的,用户数真的很多很多吗?

如果后端方便实现,可以使用长轮询,服务器压力进一步降低,并且能做到近乎实时


哦。。。还是不行,刚才考虑到一种情况: 触发了alert之类会锁死JS进程的对话框时,轮询也成了浮云。

要是用户一直不点,那铁定因为轮询中断而“被下线”

so... 要么保证页面不会弹这种模式对话框,要么就无视这种小概率事件

2011年4月15日 14:21
0 0

deng131 写道
现在问题就是需要在用户点击了确认后才能发送ajax请求

你可以变通啊,点取消的话再来一次请求,告诉服务器:“刚才那次不算”
服务器也留30秒缓冲期,一般也够用了,不考虑弹出提示30秒还不点的情况……

另外,在unload中做同步ajax啊、死循环啊什么的,各浏览器应对方法不一样,有些浏览器直接中止JS脚本,有些还等你运行,所以还是行不通。

嗯。。。以上是印象中的,以前测试过一次,更详细的最好自己测一下,不保证正确

2011年4月15日 14:21
0 0

把ajax改成同步的就是了,问题就是连接慢的话页面会有假死现象

2011年4月15日 14:21
0 0

beforeunload事件可以指定返回字符串,这样用户那里就弹出了确认提示,从而争取到多一点时间以便ajax请求发出。

so,在beforeunload中发送ajax请求,然后弹出提示,一般是很大概率成功的。

不过要注意一点,有可能用户点了否,那么你还要挽回之前发送的ajax请求

2011年4月15日 14:21

相关推荐

    JS针对浏览器窗口关闭事件的监听方法集锦

    下面将详细介绍几种常用的浏览器关闭事件监听方法。 1. 方式一:适用于IE浏览器,仅在关闭时提示 ```javascript window.onbeforeunload = onclose; function onclose() { if (event.clientX > document.body....

    JS监听关闭浏览器事件

    ### JS监听关闭浏览器事件 在Web开发中,有时我们需要对用户关闭浏览器窗口或标签页的行为进行监测,并在这些行为发生前执行某些操作。这通常涉及到`onbeforeunload`和`onunload`这两个事件处理程序。 #### 1. `...

    浏览器多窗口处理——

    一个浏览器窗口就是显示网页内容的独立视图,每个窗口可以加载不同的网页或者同一网站的不同页面。在Windows操作系统中,窗口切换是通过任务栏上的按钮或者使用Alt+Tab快捷键来完成的。在Mac OS系统中,用户则可以...

    基于JavaScript判断浏览器到底是关闭还是刷新(超准确)

    // 浏览器关闭的情况 } else { // 浏览器刷新的情况 } }; ``` 作者还提出了对Firefox的特别处理,因为Firefox在某些情况下只触发`onbeforeunload`事件,而不触发`onunload`。此外,代码中还涉及到使用jQuery的`...

    判断浏览器是刷新还是关闭窗口

    通过上述方法,我们可以在一定程度上区分用户是刷新页面还是关闭窗口,从而更好地处理页面离开时的行为。然而,需要注意的是,这些方法都不是绝对可靠的,开发者还需要根据具体应用场景进行适当的调整和优化。

    浏览器关闭事件.txt浏览器关闭事件.txt浏览器关闭事件.txt浏览器关闭事件.txt

    浏览器关闭事件通常指的是当用户关闭浏览器窗口或者离开当前网页时触发的事件。这种事件对于开发者来说非常重要,因为它可以用来做一些清理工作,比如释放资源、保存用户状态等。 #### 如何监听浏览器关闭事件 在...

    浏览器页面,禁用刷新

    总的来说,禁用浏览器页面刷新是一个复杂的过程,涉及JavaScript事件处理、前端路由、数据持久化等多个方面。理解并掌握这些知识点,对于开发交互性更强的Web应用至关重要。通过不断学习和实践,我们可以更好地平衡...

    Edge浏览器驱动程序 python程序使用使用selenium打开浏览器访问网页

    Edge浏览器驱动程序是微软开发的一款用于自动化测试和网页交互的工具,它允许程序员,特别是Python开发者,通过Selenium库来控制Microsoft Edge浏览器。Selenium是一个强大的Web自动化框架,广泛应用于功能测试、...

    网页浏览器程序设计.rar,网页浏览器程序设计.rar

    9. **数据存储**:浏览器提供本地存储机制,如Cookie、LocalStorage、SessionStorage、IndexedDB等,用于在用户关闭浏览器后保留数据。 10. **跨平台兼容**:浏览器需要在不同的操作系统和设备上运行,如Windows、...

    多页面浏览器1.0

    多页面浏览是该浏览器的一个关键特性,它允许用户在同一窗口内打开多个网页,就像现代的Chrome、Firefox等主流浏览器一样。这种设计极大地提高了浏览效率,用户可以在不同的网页之间快速切换,无需频繁地打开和关闭...

    单点登录+在线列表+防浏览器关闭

    SessionStorage用于存储同源页面间的会话数据,而LocalStorage则可以持久化存储数据,即便浏览器关闭后仍能保留。 3. **AJAX轮询**:通过定时发送AJAX请求,服务器可以检查客户端是否在线。如果在一段时间内没有...

    c# 版多页面浏览器

    本项目“C#版多页面浏览器”是利用C#语言构建的一个具备多标签页功能的网络浏览应用,旨在提供一个用户友好的界面,让用户可以在同一窗口下浏览多个网页,类似于我们常见的Chrome或Firefox浏览器。 在实现这样一个...

    模拟浏览器打开相应网页

    在处理特定的网页时,可能还需要了解HTML、CSS选择器、XPath等知识,以便准确地定位和操作页面元素。同时,考虑到网页安全和隐私,进行这类操作时应遵守相关法律法规,避免侵犯他人权益。 综上所述,模拟浏览器打开...

    vue如何在用户要关闭当前网页时弹出提示的实现

    本文介绍了vue如何在用户要关闭当前网页时弹出提示的实现,分享给大家,具体如下: 效果如下图 正常 js 页面处理方式 [removed] = function (e) { e = e || window.event; // 兼容IE8和Firefox 4之前的版本 if ...

    多页面浏览器实现

    通过控制WebBrowser控件的实例,可以实现打开、关闭、前进、后退等浏览器的基本操作,同时,还可以通过导航事件(如Navigating、DocumentCompleted等)进行交互逻辑的处理。 `LINQ (Language Integrated Query)`是...

    怎么关闭谷歌chrome浏览器网页广告声音?.docx

    ### 如何关闭谷歌Chrome浏览器中的网页广告声音 在日常上网浏览的过程中,网页广告声音往往会不经意地响起,有时会给用户带来不小的困扰。为了更好地控制浏览器中各个标签页的声音播放,谷歌Chrome浏览器提供了一...

    易语言浏览器操作模块源码.7z

    3. **页面状态检查**:“网页加载完成”事件可用于监听页面是否加载完毕,便于后续处理。 4. **网络请求**:可能包含“发送HTTP请求”、“接收HTTP响应”等,用于模拟用户向服务器发送数据。 5. **数据抓取**:如...

    flex4浏览器关闭

    综上所述,这个"flex4浏览器关闭"的示例展示了如何在Flex4应用中处理浏览器关闭事件,包括监听事件、显示确认对话框、保存数据和清理资源。通过理解和实践这些概念,开发者可以更好地控制Flex应用在浏览器环境中的...

    用C#实现的一个多窗口浏览器

    1. **多窗口支持**:与传统的单窗口浏览器不同,这个应用允许用户在同一时间打开多个独立的浏览器窗口,每个窗口都有自己的选项卡集合,这样用户可以在不同的任务之间轻松切换,而不会混淆各个页面。 2. **多选项卡...

    vb.net实现多标签网页浏览器

    【VB.NET实现多标签网页浏览器】是一个基于VB.NET 2008开发的应用程序,它提供了类似现代浏览器的用户体验,支持多个标签同时打开不同的网页,同时也集成了百度搜索引擎,使得用户可以直接在应用程序内部进行网络...

Global site tag (gtag.js) - Google Analytics