必须为网站单独配置Background Sync权限并启用chrome://flags实验功能,否则registration.sync为空或抛SecurityError;授权后存表单至IndexedDB再注册唯一tag同步任务。

要在谷歌浏览器中让网站具备离线提交表单后自动联网重发的能力,必须为该网站单独配置Background Sync后台同步权限,否则即使代码注册了sync事件,浏览器也会静默拒绝。
启用浏览器级Background Sync实验功能
Chrome默认可能未启用底层API支持,需手动激活实验性开关,否则registration.sync对象为空,后续所有注册都会失败。
在地址栏输入 chrome://flags → 搜索“background sync” → 找到“Enable Background Sync”选项 → 将其设为【Enabled】 → 点击右下角“Relaunch”重启浏览器。
为特定网站授予后台同步权限
全局开关开启后,仍需对目标网站单独授权,这是Chrome强制的安全策略,未授权的域名调用registration.sync.register()会直接抛出SecurityError异常。
方法一:快捷直达设置页
在地址栏输入 chrome://settings/content/siteDetails?site=https://yourdomain.com(将yourdomain.com替换为实际域名)→ 回车进入该站点专属设置页 → 向下滚动至“权限”区域 → 找到“后台同步” → 点击右侧下拉菜单 → 选择【允许】。
方法二:从主设置入口进入
点击右上角三点菜单 → “设置” → 左侧“隐私和安全” → “网站设置” → “更多内容设置” → “后台同步” → 点击“添加”按钮 → 输入完整域名(如https://app.example.com),注意必须带https协议头 → 保存。
验证权限是否生效
权限设置完成后,必须刷新页面才能使新权限注入当前上下文,否则JavaScript中检查navigator.serviceWorker.ready.then(reg => reg.sync)仍会返回undefined。
第一步:打开目标网站页面
第二步:按F12打开开发者工具 → 切换到Console标签页
第三步:粘贴并执行以下代码:
if('serviceWorker' in navigator && 'SyncManager' in window) { navigator.serviceWorker.ready.then(reg => console.log('Sync可用:', !!reg.sync)); }
若控制台输出“Sync可用: true”,说明配置成功;若为false,请返回前两步检查chrome://flags是否已重启、域名是否拼写正确、是否漏掉https前缀。
在网页中注册同步任务
权限与API就绪后,用户触发表单提交时,前端需先存数据到IndexedDB,再注册同步任务。这一步不能省略——Background Sync本身不存储数据,只负责触发回调。
① 确保页面已注册Service Worker且作用域覆盖当前路径
② 在表单提交事件处理函数中,当检测到navigator.onLine为false时:
— 调用indexedDB API将表单JSON序列化后写入指定objectStore
— 获取registration对象后执行:registration.sync.register('submit-form-data')
注意:tag名必须是字符串,且同一tag在未完成前重复调用register会被忽略,因此建议每次提交使用唯一tag或业务语义化tag(如'submit-order-12345')。
检查挂起的同步任务
注册后的任务不会立刻执行,而是由Chrome内部调度器管理。要确认任务是否已登记成功,需通过Application面板查看。
打开开发者工具 → 切换到“Application”标签页 → 左侧菜单选择“Background Sync” → 页面将列出当前所有已注册但尚未触发的sync任务,包括tag名、注册时间、是否已完成。
若此处为空,说明注册失败,常见原因为:域名未授权、Service Worker未激活、页面非HTTPS/localhost、或调用时registration对象为空。



















