You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Electron中BrowserWindow网络离线时出现白屏如何有效检测?

问题原因

离线状态下触发did-finish-load而非did-fail-load,通常是因为Chromium内核返回了状态码为200的空响应(比如命中空缓存、Service Worker返回空内容),Electron会判定页面加载成功,所以不会触发失败回调。


推荐解决方案

方案1:DOM特征校验(性能最优,首选方案)

在did-finish-load触发后,主动注入脚本检测目标站点的特征节点是否存在、页面内容长度是否符合预期即可快速判断是否白屏。

const win = new BrowserWindow();
// 替换为你加载的外部站点实际存在的根节点选择器,比如React的#root、Vue的#app等
const TARGET_ROOT_SELECTOR = '#app';
// 正常页面body内容最少字符数阈值,根据站点实际情况调整
const MIN_CONTENT_LENGTH = 100;

win.loadURL('https://.../app');

const checkPageValid = async () => {
  try {
    const isValid = await win.webContents.executeJavaScript(`
      !!document.querySelector('${TARGET_ROOT_SELECTOR}') && document.body.innerText.length > ${MIN_CONTENT_LENGTH}
    `);
    if (!isValid) {
      // 检测到白屏,执行兜底逻辑,比如加载本地离线错误页
      win.loadFile('error-offline.html');
    }
  } catch (err) {
    // 脚本执行异常也判定为加载失败
    win.loadFile('error-offline.html');
  }
}

win.webContents.on('did-finish-load', () => {
  checkPageValid();
});

win.webContents.on('did-fail-load', () => {
  win.loadFile('error-offline.html');
});

globalShortcut.register('CommandOrControl+R', () => win.webContents.reload());

方案2:网络状态预校验

主进程提前判断网络状态,离线时直接跳转本地错误页,避免加载外部站点出现白屏。

const { net, BrowserWindow, globalShortcut } = require('electron');
const win = new BrowserWindow();
// 监听全局网络状态
let isOnline = net.isOnline();
net.on('online', () => isOnline = true);
net.on('offline', () => isOnline = false);

const loadTargetPage = () => {
  if (!isOnline) {
    win.loadFile('error-offline.html');
    return;
  }
  win.loadURL('https://.../app');
}

loadTargetPage();

// 刷新操作前先校验网络状态
globalShortcut.register('CommandOrControl+R', () => {
  if (!isOnline) {
    win.loadFile('error-offline.html');
    return;
  }
  win.webContents.reload();
});

方案3:截图像素校验(兜底方案)

如果外部站点没有固定特征节点,可在页面加载完成后截图统计白色像素占比,超过阈值判定为白屏。

win.webContents.on('did-finish-load', async () => {
  const captureImage = await win.webContents.capturePage();
  const bitmap = captureImage.getBitmap();
  let whitePixelCount = 0;
  // 每4个字节对应一个像素的RGBA值
  for (let i = 0; i < bitmap.length; i += 4) {
    const r = bitmap[i], g = bitmap[i+1], b = bitmap[i+2];
    // 接近白色的阈值,可根据实际调整
    if (r > 250 && g > 250 && b > 250) {
      whitePixelCount++;
    }
  }
  const whiteRatio = whitePixelCount / (bitmap.length / 4);
  // 白色占比超过90%判定为白屏
  if (whiteRatio > 0.9) {
    win.loadFile('error-offline.html');
  }
});

内容的提问来源于stack exchange,提问作者hanulo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 21:51:02