在用户离开选项卡或关闭屏幕后,如何检测浏览器何时限制计时器和 websocket 断开连接? (javascript)

2024-02-16

Context

一款作为渐进式网络应用程序发布的游戏,具有计时器(setTimeout, setInterval)和 websocket 连接以获得实时通信。

怎么了

只要用户留在应用程序中,一切都很好。但是,当用户转到另一个选项卡、另一个应用程序或关闭屏幕(如果是移动设备)时,它就变成了“地狱般的未知世界”。

  • Websocket 可能会也可能不会“暂停”或“关闭”
  • 计时器看起来像是受到限制或反跳。

这种行为似乎取决于浏览器和平台,甚至可能取决于特定的用户行为。我猜浏览器和操作系统有自己的生命周期/机制来节省电池和/或计算。

当用户回来时,应用程序处于未知状态,我正在努力正确恢复状态。

关于 websockets 我有自动重新连接套接字.io https://socket.io/ and 重新连接-websocket https://github.com/pladaria/reconnecting-websocket但这还不足以解决所有问题。

寻找答案

  • 不同浏览器的“生命周期”是什么?这有记录吗?他们什么时候决定关闭并节流?
  • 他们对 websocket 到底做了什么?浏览器只是断开它们?
  • 他们对计时器到底做了什么?他们限制它们或使它们反跳还是其他什么?
  • javascript 执行一般会发生什么?暂停/销毁/限制?
  • 当浏览器要关闭某些东西时,有没有办法挂钩某种浏览器生命周期事件?我唯一能找到的可能是可见性API https://developer.mozilla.org/en-US/docs/Web/API/Page_Visibility_API
  • 有没有办法人为地重现这种行为以便能够测试解决方案?在桌面上尤其困难。 Websocket 无法关闭,并且 chromium 开发人员似乎并不急于提供帮助2014 年的一个问题(!):使用连接限制时不包括 websockets https://bugs.chromium.org/p/chromium/issues/detail?id=423246

  • 不管上述情况,是否有一个实用的跨浏览器解决方案来检测/解决这个问题? (例如,根据经验,桌面版 Firefox 的行为似乎与 Chrome 完全不同,iPhone 比 Android 更频繁地断开连接)

相关链接

  • 当页面未处于焦点时,Safari 由于不活动而断开 Web 套接字连接 https://github.com/socketio/socket.io/issues/2924

不太确定,但你可以使用服务人员。据我所知,即使您的选项卡未打开,它们也会在后台运行,如果您的选项卡关闭,它们也会终止。

顺便提一句。每个浏览器上的浏览器选项卡的生命周期似乎都不同,因为每个浏览器处理它的方式都不同。据我所知,如果浏览器需要更多内存来处理其他事情,它可以冻结选项卡。

这是来自的文档Chrome https://developers.google.com/web/updates/2018/07/page-lifecycle-api.

我记得有一些事件(例如 onload)会告诉您用户是否离开或重新打开了选项卡。您可以使用这些事件来重新连接等。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在用户离开选项卡或关闭屏幕后,如何检测浏览器何时限制计时器和 websocket 断开连接? (javascript) 的相关文章

  • 单值或常量值时在 x 轴上绘制的样条图 - highchart

    while using the older version of highchart 2 1 6 if a plot had only one value or a series of same values it would plot a
  • JavaScript 对象引用缓存

    我们的代码库中有很多对象 它们的名称空间是为了避免冲突 Example App local view MyView 在我在代码库中看到的大多数地方 我们使用完整路径来获取对对象的引用 并且这在同一函数中重复多次 Example functi
  • React 渲染中的不变违规或 React 中迭代和返回的正确方法

    我在 React 渲染中遇到了持续存在的问题 这段代码 jsx React DOM var AnswerRows React createClass componentDidMount function render function th
  • 如何使用 LinkedIn javascript sdk 检索包括所有字段的职位列表?

    我想要获取 LinkedIn 会员在其个人资料中输入的每个职位的 ID 头衔 摘要 开始日期 结束日期 当前状态和公司名称 我测试了一个查询休息控制台 https apigee com console linkedin我得到了想要的结果 查
  • 向对象添加元素

    我需要填充一个 json 文件 现在我有这样的东西 element id 10 quantity 1 我需要添加另一个 元素 我的第一步是使用该 json 将该 json 放入对象类型中cart JSON parse 现在我需要添加新元素
  • 浏览器如何比较 URL 进行缓存?

    具体来说 URL 的哪些部分用于比较 假设我在以下位置提供 CSS 样式表https www example com a b test css具有适当的 HTTP 标头cache control max age等等 当用户稍后访问以下每个
  • JQuery DataTable 单元格从行单击

    我正在尝试在 jquery 数据表上实现一个函数 该函数返回单击行的第一列和第四列 我正在遵循这个示例 它允许我操作单击的行http datatables net examples api select single row html ht
  • 在 vue.js 模板中包含外部脚本

    我是 Vue js 和 web pack 的新手 所以我决定使用 vue cli webpack 来构建初始应用程序 我试图包含一个外部脚本 例如组件 不需要的模板中 但是 Vue 警告这是不允许的 我的 index html 文件与最初生
  • Chrome Javascript 调试器暂停时不会重新加载页面

    有时 当我在 Chrome 中调试某些 javascript 并且暂停了 javascript 时 如果我尝试重新加载页面 chrome 只会 继续 调试器 单步执行到下一个断点 似乎没有任何方法可以强制 javascript 完全停止运行
  • 使用 onBlur 事件上的值更新 React 输入文本字段

    我有以下输入字段 在模糊时 该函数调用服务来更新服务器的输入值 完成后 它会更新输入字段 我怎样才能让它发挥作用 我可以理解为什么它不允许我更改字段 但我能做些什么才能使其工作 我无法使用defaultValue因为我会将这些字段更改为其他
  • Postman - 如何计算 JSON 响应中特定对象的出现次数

    我是 JSON 和 Postman 的新手 我相信我正在尝试做一些非常简单的事情 我创建了一个 GET 请求 它将获得如下所示的 JSON 响应 在下面的例子中我想得到count响应中所有 IsArchived 属性 这些属性的数量因响应而
  • 为什么我需要 $(document.body) 来使用 Mootools Element 方法扩展 document.body?

    因此 在尝试让我的应用程序在最新的 IE 上运行后 结果发现 IE 不喜欢以下代码 document body getElement className Firefox 和 Chrome 响应良好 但是document bodyIE 上没有
  • 如何在粘贴时获取文本区域输入字段的新值?

    我发现当我尝试从文本区域字段读取值时onpaste调用函数时 我得到字段的旧值 粘贴操作之前的值 而不是新值 粘贴操作之后的值 以下是此行为的演示 http jsfiddle net qsDnr http jsfiddle net qsDn
  • 在声明组件选择器时添加指令 - Angular 7

    我正在学习 Angular 并通过单击按钮动态创建组件 我正在尝试使用 Angular Material 的拖放功能来拖动这些创建的组件以对它们进行排序 我的基本组件 html 中有以下代码 div style margin 20px di
  • ThreeJS无法加载Json文件

    首先 我已经读过这个问题 https stackoverflow com questions 17201888 three js exporter export object not working with jsonloader r58没
  • Dojo/on 和捕获阶段

    有没有办法用 dojo on 在捕获阶段 而不是冒泡阶段 触发事件 我最终在这里寻找有关 on 的前身 dojo connect 的信息 就其价值而言 dojo connect 似乎不支持捕获阶段的事件侦听器 它的工作原理是将事件处理程序作
  • 在 Google Apps 脚本中的文本前插入换行符

    我需要在 Google 文档中的某些文本之前插入一些换行符 尝试过这种方法但出现错误 var body DocumentApp getActiveDocument getBody var pattern WORD 1 var found b
  • 使用 jquery 提供附加功能时菜单未正确对齐

    I need to make a mega menu similar to one as show in image below 到目前为止 我已经能够在某种程度上使其发挥作用 例如jsFiddle 在这里 http jsfiddle ne
  • FullCalendar 检查选择日是否有活动?

    我正在使用 Full Calendar js 插件 到目前为止一切顺利 但我想检查开始和结束之间的选择是否有事件 我只需要返回 true 或 false 基本上 如果日期选择中已经存在事件 我想阻止用户创建事件 var calendar c
  • Serviceworker Bug event.respondWith

    我的 serviceworker 的逻辑是 当发生获取事件时 它首先获取包含一些布尔值 而不是 event request url 的端点 并根据我正在调用的值检查该值event respondWith 对于当前的获取事件 我正在提供来自缓

随机推荐