如何关闭Chrome Sleep Mode?旧设置失效后的解决方案咨询
解决Chrome新版闲置标签页睡眠模式导致JS/AJAX停止的问题
Chrome新版移除了关闭闲置标签页睡眠模式的设置,现在即便关闭性能节流选项,闲置标签页仍会进入睡眠状态,导致JS停止运行、AJAX请求无法发起。给你几个实测有效的解决思路:
用Web Worker绕开睡眠限制
Web Worker运行在后台独立线程,不受标签页睡眠影响。把需要持续执行的AJAX逻辑放到Worker中即可,比如定时轮询场景:// 主页面代码 const ajaxWorker = new Worker('ajax-worker.js'); // 向Worker传递请求地址 ajaxWorker.postMessage({ apiUrl: '你的接口地址' }); // 接收Worker返回的请求结果 ajaxWorker.onmessage = (e) => { console.log('AJAX请求结果:', e.data); }; // ajax-worker.js 内容 self.onmessage = (e) => { // 每隔5秒发起一次请求 setInterval(() => { fetch(e.data.apiUrl) .then(res => res.json()) .then(data => self.postMessage(data)) .catch(err => console.error('请求失败:', err)); }, 5000); };页面可见性API+心跳DOM操作
无法彻底阻止睡眠,但可以在标签页恢复活跃时立刻补发起请求,同时用微小DOM操作尝试延缓睡眠(部分场景有效):let heartbeatTimer; // 执行微小DOM变更维持标签页活跃 const keepAlive = () => { document.body.style.opacity = document.body.style.opacity === '1' ? '0.999' : '1'; }; // 监听标签页可见性变化 document.addEventListener('visibilitychange', () => { if (document.hidden) { // 标签页隐藏时启动心跳 heartbeatTimer = setInterval(keepAlive, 1000); } else { // 标签页恢复时停止心跳,立即发起AJAX clearInterval(heartbeatTimer); fetch('你的接口地址') .then(res => res.json()) .then(data => console.log('恢复活跃后请求结果:', data)); } });尝试Chrome实验性标志(注意风险)
在地址栏输入chrome://flags/#calculate-native-win-occlusion,将该选项设置为Disabled,部分新版Chrome中该设置可禁用标签页遮挡检测,间接阻止睡眠。但实验性标志随时可能被移除,也可能导致浏览器不稳定,谨慎使用。改用服务端推送替代AJAX轮询
如果业务允许,放弃定时AJAX轮询,换成WebSocket或Server-Sent Events(SSE)。这类持久化连接Chrome对闲置标签页的限制更宽松,能实现服务端主动推送数据,无需前端主动发起请求。
内容的提问来源于stack exchange,提问作者Yunus Emre Polat
相关产品推荐
相关产品推荐

