javascript - 在JavaScript中检测浏览器的在线状态

标签 javascript google-chrome firefox microsoft-edge

我在移动设备和 Linux 上测试了以下代码,它正确报告了在线状态更改。

<script>
    function updateOnlineStatus(event) {      
      onlineStatusIndicator.innerHTML = navigator.onLine ? 'online' : 'offline';
    }
    window.addEventListener('online', updateOnlineStatus);
    window.addEventListener('offline', updateOnlineStatus);
    document.addEventListener('DOMContentLoaded', () => {      
      var onlineStatusIndicator = document.querySelector(
        '#onlineStatusIndicator'
      );
      updateOnlineStatus();
    });
</script>

当我在 Windows 10 上使用以下适配器时,单独关闭 WiFi 适配器不会报告离线状态。我还必须关闭 vEthernet(默认交换机)和 vEthernet(Docker/NAT)才能获得预期的行为。

enter image description here

因此,如果 hyper-v 已打开,我们就不能依赖 wifi 连接更改来检测在线/离线状态,除非我们也在 vEthernet 适配器上执行相同的连接更改。这是正确的吗?

最佳答案

只要浏览器连接网络的能力发生变化,Navigator.onLine 属性就会发送更新。当用户点击链接或脚本请求远程页面时,就会发生更新。例如,当用户在失去互联网连接后不久单击链接时,该属性应返回 false。

浏览器以不同的方式实现此属性。

在 Chrome 和 Safari 中,如果浏览器无法连接到局域网 (LAN) 或路由器,则表示浏览器处于离线状态;所有其他条件返回 true。因此,虽然您可以假设浏览器在返回 false 值时处于离线状态,但您不能假设 true 值一定意味着浏览器可以访问互联网。您可能会收到误报,例如计算机运行的虚拟化软件具有始终“连接”的虚拟以太网适配器。因此,如果你真的想确定浏览器的在线状态,你应该开发额外的手段来检查。

在 Firefox 和 Internet Explorer 中,将浏览器切换到离线模式会发送错误值。在 Firefox 41 之前,所有其他条件都返回真值;在 Windows 上的 Nightly 68 上测试实际行为表明,它只查找 LAN 连接,如 Chrome 和 Safari 给出误报。

引用:

Navigator.onLine

关于javascript - 在JavaScript中检测浏览器的在线状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59919230/

相关文章:

javascript - 按下后退按钮时如何保留可滚动区域的滚动位置?

javascript - 我怎样才能捕捉到 firefox 拼写检查更正事件?

javascript - javascript中同名函数内的函数

javascript - 如何添加与光线转换的碰撞?

javascript - 在 Chrome 扩展内容脚本中,我必须在处理文档之前等待 document.ready 吗?

google-chrome - list 提取失败(9)

javascript - 在不刷新页面的情况下更新 DataTables 表中的行

javascript - VueJS如何用emit代替dispatch

php - 为什么我的注册表单适用于除 Firefox 之外的所有浏览器?

.net - 使用 IHttpHandler 时,Firefox 无法正确处理内容类型