0

0

javascript如何检测网络状态_怎样处理在线和离线事件

幻影之瞳

幻影之瞳

发布时间:2026-01-13 17:43:59

|

142人浏览过

|

来源于php中文网

原创

应监听 online/offline 事件并结合主动 fetch 探测:页面加载时读取 navigator.onLine 初始值,绑定事件监听网络切换,再通过 HEAD 请求 /health 等 endpoint 验证服务可达性,避免仅依赖浏览器在线状态。

javascript如何检测网络状态_怎样处理在线和离线事件

如何监听 navigator.onLine 的实时变化

navigator.onLine 是一个只读布尔值,但它**不会自动响应网络切换**——它只在页面加载时取一次初始值,之后除非手动触发或浏览器主动更新(如 Chrome/Firefox 在某些网络断开瞬间会同步更新),否则不会变。所以不能只靠轮询 navigator.onLine 来判断真实状态。

正确做法是监听全局的 onlineoffline 事件:

window.addEventListener('online', () => {
  console.log('已联网');
});
window.addEventListener('offline', () => {
  console.log('已离线');
});
  • 这两个事件触发及时性依赖浏览器实现,Chrome 和 Firefox 支持较好;Safari 在某些 macOS/iOS 版本中对 offline 响应有延迟甚至不触发
  • 事件只反映“系统级网络接口是否可用”,不是“能否访问目标服务器”。比如 Wi-Fi 已连但路由器断网,navigator.onLine 仍为 true
  • 页面刚打开时,建议先读一次 navigator.onLine,再绑定事件,避免错过初始状态

为什么单纯靠 online/offline 事件不够用

这些事件无法检测以下真实业务场景:

  • Wi-Fi 连接正常,但 API 接口返回 503 Service Unavailable 或超时
  • 用户处于“飞行模式+手动开启 Wi-Fi”,navigator.onLinetrue,但实际无上行路由
  • 企业内网环境,DNS 不通或代理拦截,导致 fetch 失败,但浏览器认为“在线”

因此必须结合主动探测:

立即学习Java免费学习笔记(深入)”;

推荐用轻量 fetch 请求一个稳定、低开销的 endpoint(例如自己服务的 /healthhttps://www.google.com/generate_204):

Cliclic AI
Cliclic AI

Cliclic商品背景图编辑器是一款功能强大的AI工具,帮助用户快速生成具有吸引力的商品图背景。

下载
async function checkServerReachable() {
  try {
    const res = await fetch('/health', { method: 'HEAD', cache: 'no-cache' });
    return res.ok;
  } catch (e) {
    return false;
  }
}
  • 不要用 GET 请求图片或空资源,容易被缓存或触发 CORS
  • cache: 'no-cache' 防止 Service Worker 或浏览器缓存干扰判断
  • 避免高频轮询(如每秒一次),建议首次离线后延时 5–10 秒再探,或仅在用户操作前检查

离线时该做什么:缓存策略与 UI 反馈要点

检测到 offline 后,不能只弹个提示就结束。关键动作包括:

  • 暂停所有非幂等请求(如 POST / PUT),把它们暂存到 IndexedDB 或 localStorage,等恢复后再重放
  • 禁用依赖网络的交互控件(如提交按钮、搜索框),并用 aria-busy="true" 或 CSS 类标明不可用状态
  • 如果使用了 Service Worker,确保 precache 了核心静态资源(HTML/CSS/JS),否则离线时白屏
  • 避免在 offline 事件回调里直接调 alert() —— 移动端可能被拦截,且打断用户操作流

UI 提示建议用轻量 toast,带明确恢复机制(如“重试”按钮),而不是全屏遮罩。

兼容性与移动端特殊行为注意点

Android WebView 和 iOS WKWebView 对 online/offline 事件支持不一致:

  • 部分 Android 旧版 WebView 完全不触发这两个事件,需 fallback 到定时 fetch 探测
  • iOS Safari 在后台标签页中可能冻结 JS 执行,导致事件延迟数秒甚至丢失
  • PWA 应用若注册了 Service Worker,可通过 self.registration.update() + waiting 状态间接感知网络恢复(需配合 message channel)
  • navigator.onLine 在 Electron 中反映的是主进程网络状态,渲染进程需通过 IPC 同步

真正健壮的网络状态管理,永远是「事件监听 + 主动探测 + 业务层兜底」三层组合。别指望单个 API 解决所有问题。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
chrome什么意思
chrome什么意思

chrome是浏览器的意思,由Google开发的网络浏览器,它在2008年首次发布,并迅速成为全球最受欢迎的浏览器之一。本专题为大家提供chrome相关的文章、下载、课程内容,供大家免费下载体验。

1060

2023.08.11

chrome无法加载插件怎么办
chrome无法加载插件怎么办

chrome无法加载插件可以通过检查插件是否已正确安装、禁用和启用插件、清除插件缓存、更新浏览器和插件、检查网络连接和尝试在隐身模式下加载插件方法解决。更多关于chrome相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

841

2023.11.06

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1948

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

658

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2401

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

47

2026.01.19

Golang channel原理
Golang channel原理

本专题整合了Golang channel通信相关介绍,阅读专题下面的文章了解更多详细内容。

261

2025.11.14

golang channel相关教程
golang channel相关教程

本专题整合了golang处理channel相关教程,阅读专题下面的文章了解更多详细内容。

351

2025.11.17

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

26

2026.03.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Sass 教程
Sass 教程

共14课时 | 0.9万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.6万人学习

CSS教程
CSS教程

共754课时 | 42.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号