怎么利用 Navigator.onLine 监控 HTML 编辑器的网络状态并切换离线模式

大明同学_4758

大明同学_4758

2026-06-08

683人浏览

原创

navigator.online 不可靠,仅反映网卡状态而非服务器可达性,需结合 online/offline 事件监听与 fetch 健康检查,并在离线时降级功能、本地持久化、防覆盖。

怎么利用 navigator.online 监控 html 编辑器的网络状态并切换离线模式

为什么 navigator.onLine 不能直接信,尤其对编辑器类应用

HTML 编辑器(比如基于 contenteditable 或 Monaco/CodeMirror 的富文本/代码编辑器)依赖实时同步、自动保存、协作光标等功能,一旦误判网络状态,轻则草稿丢失,重则覆盖他人修改。而 navigator.onLine 返回 true 时,常见现象是:fetch('/api/save') 卡住、报 TypeError: Failed to fetch,或返回 504 Gateway Timeout——这说明它只感知到“网卡通”,完全不反映服务器可达性、DNS 是否正常、代理是否存活。

更麻烦的是:某些浏览器(如旧版 Safari iOS)会恒返 true;PWA 场景下 Service Worker 可能缓存响应,导致 navigator.onLine === true 但实际请求全走 cache,掩盖真实断连。

  • 别把 navigator.onLine 当网络 ping 工具用
  • 它初始化值只在页面加载那一刻有效,之后不会自动更新,必须配合事件监听
  • 编辑器首次加载时若离线,navigator.onLine 可能仍为 true(尤其 DevTools 离线模式未提前启用)

必须绑定的两个事件:online 和 offline

仅靠读取 navigator.onLine 做一次判断,编辑器无法响应用户中途断网。必须监听 window 上的 online 和 offline 事件,且要在脚本执行早期就注册——否则可能错过首次状态切换(比如用户打开页面时已离线,但事件不会回溯触发)。

推荐写法(兼容 Safari、Chrome、Edge):

Save Usage ~4x (Codex oAuth users)
Save Usage ~4x (Codex oAuth users)

一款AI工具,主要用于{,适合需要提升相关任务效率的用户。

下载
const handleOnline = () => {
  editor.setState({ isOnline: true });
  // 触发一次健康检查,再决定是否重发草稿队列
};
const handleOffline = () => {
  editor.setState({ isOnline: false });
  // 暂停 autosave 定时器、禁用「发布」「同步」按钮
};

window.addEventListener('online', handleOnline);
window.addEventListener('offline', handleOffline);

// 清理(例如在 React useEffect cleanup 或页面卸载前)
// window.removeEventListener('online', handleOnline);
// window.removeEventListener('offline', handleOffline);
  • 不要委托到 document 或其他元素——这两个事件不冒泡,只能直接绑 window
  • 避免在异步回调(如 setTimeout)里才绑定,否则可能漏掉初始状态变更
  • 如果用了 Service Worker,别指望它影响 navigator.onLine 值;它和 SW 是两套机制

怎么用 fetch 做二次验证,防止「假在线」坑编辑器

编辑器进入「在线」状态后,不能立刻执行同步逻辑。必须发起一次带超时的轻量探测,确认服务端真实可达。否则用户点「保存」后界面显示成功,其实请求早已失败,本地草稿被错误标记为「已提交」。

推荐使用 HEAD 请求 + AbortSignal.timeout():

async function checkServerReachable() {
  try {
    const res = await fetch('/health', {
      method: 'HEAD',
      cache: 'no-store',
      signal: AbortSignal.timeout(2500)
    });
    return res.ok; // 仅 2xx 才算通过
  } catch (e) {
    return false;
  }
}
  • 路径选 /health(或你后端提供的无副作用探针端点),别用 / 或 /api/status,避免触发 SSR 或鉴权逻辑
  • 用 HEAD 而非 GET,减少带宽与服务端压力
  • 超时设 2–3 秒:太短易误判(尤其移动端弱网),太长会让 UI 停滞感明显
  • 只在 online 事件触发后调用一次,不要轮询;离线期间无需验证

离线模式下编辑器该做什么,而不是「冻结」

检测到离线后,编辑器不该变灰禁用全部功能。真正要做的,是降级而非停止:

  • 把「保存」按钮文字改为「已暂存(离线)」,并保持可点击(点击后弹 toast 提示「正在离线编辑,上线后自动同步」)
  • 将每次内容变更序列化后存入 localStorage(键名建议含时间戳或哈希,避免冲突),而非只存最后一次
  • 禁用实时协作功能(如光标共享、@ 提及),但允许本地评论/高亮等不需服务端的操作
  • 列表页/资源树若依赖 API,切换为读取上次成功缓存的 JSON(可用 sessionStorage 存,关页即丢,避免陈旧数据干扰)
  • 上线后,优先比对本地草稿哈希和服务端版本,避免静默覆盖

最易被忽略的一点:离线期间用户可能关闭标签页。必须在 beforeunload 钩子中主动保存当前快照,否则所有未显式「暂存」的编辑都会丢失——而用户根本没意识到自己处于离线状态。

前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!

HTML速学教程(入门课程)
HTML速学教程(入门课程)

HTML怎么学习?HTML怎么入门?HTML在哪学?HTML怎么学才快?不用担心,这里为大家提供了HTML速学教程(入门课程),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
html版权符号
html版权符号

html版权符号是“©”,可以在html源文件中直接输入或者从word中复制粘贴过来,php中文网还为大家带来html的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.14

5875

7

html在线编辑器
html在线编辑器

html在线编辑器是用于在线编辑的工具,编辑的内容是基于HTML的文档。它经常被应用于留言板留言、论坛发贴、Blog编写日志或等需要用户输入普通HTML的地方,是Web应用的常用模块之一。php中文网为大家带来了html在线编辑器的相关教程、以及相关文章等内容,供大家免费下载使用。

2023.06.21

3332

4

html网页制作
html网页制作

html网页制作是指使用超文本标记语言来设计和创建网页的过程,html是一种标记语言,它使用标记来描述文档结构和语义,并定义了网页中的各种元素和内容的呈现方式。本专题为大家提供html网页制作的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.31

2990

5

html空格
html空格

html空格是一种用于在网页中添加间隔和对齐文本的特殊字符,被用于在网页中插入额外的空间,以改变元素之间的排列和对齐方式。本专题为大家提供html空格的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.01

3019

5

html是什么
html是什么

HTML是一种标准标记语言,用于创建和呈现网页的结构和内容,是互联网发展的基石,为网页开发提供了丰富的功能和灵活性。本专题为大家提供html相关的各种文章、以及下载和课程。

2023.08.11

4819

6

html字体大小怎么设置
html字体大小怎么设置

在网页设计中,字体大小的选择是至关重要的。合理的字体大小不仅可以提升网页的可读性,还能够影响用户对网页整体布局的感知。php中文网将介绍一些常用的方法和技巧,帮助您在HTML中设置合适的字体大小。

2023.08.11

2961

3

html转txt
html转txt

html转txt的方法有使用文本编辑器、使用在线转换工具和使用Python编程。本专题为大家提供html转txt相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.31

2769

3

html文本框代码怎么写
html文本框代码怎么写

html文本框代码:1、单行文本框【<input type="text" style="height:..;width:..;" />】;2、多行文本框【textarea style=";height:;"></textare】。

2023.09.01

2468

6

HTML嵌入CSS样式的方法
HTML嵌入CSS样式的方法

HTML嵌入CSS样式的方法有内联样式、内部样式表和外部样式表。本专题为大家提供CSS样式相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.20

2508

5

热门下载

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

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.6万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.4万人学习