检测互联网连接是否离线?

IT技术 javascript ajax offline connectivity internet-connection
2021-01-16 12:14:15

如何在 JavaScript 中检测 Internet 连接离线?

6个回答

您可以通过发出失败的 XHR 请求来确定连接丢失

标准方法是多次重试请求如果它没有通过,提醒用户检查连接,并优雅地失败

旁注:将整个应用程序置于“离线”状态可能会导致处理状态的许多容易出错的工作......无线连接可能会来来去去等。所以你最好的选择可能是优雅地失败,保留数据,并提醒用户.. 允许他们最终解决连接问题(如果有的话),并继续使用你的应用程序,并有一定的宽容度。

旁注:您可以检查像谷歌这样的可靠网站的连接性,但这可能并不完全有用,因为只是尝试提出您自己的请求,因为虽然谷歌可能可用,但您自己的应用程序可能不可用,而且您仍然会必须处理您自己的连接问题。尝试向谷歌发送 ping 是确认互联网连接本身已关闭的好方法,因此如果该信息对您有用,那么麻烦就值得了。

旁注发送 Ping的方式与您发出任何类型的双向 ajax 请求的方式相同,但在这种情况下,向 google 发送 ping 会带来一些挑战。首先,我们会遇到与进行 Ajax 通信时通常遇到的相同的跨域问题。一种选择是设置服务器端代理,我们实际上在其中使用pinggoogle(或任何站点),并将 ping 的结果返回给应用程序。这是一个catch-22因为如果互联网连接确实是问题,我们将无法访问服务器,如果连接问题仅在我们自己的域上,我们将无法区分。可以尝试其他跨域技术,例如,在指向 google.com 的页面中嵌入 iframe,然后轮询 iframe 的成功/失败(检查内容等)。嵌入图像可能并不能真正告诉我们任何信息,因为我们需要来自通信机制的有用响应,以便对正在发生的事情得出一个好的结论。因此,再次确定整个互联网连接的状态可能比它的value更麻烦。您必须为您的特定应用权衡这些选项。

"One option is to set up a server-side proxy, wherein we actually ping google (or whatever site), and return the results of the ping to the app". 不应将其声明为要检查的可能解决方案即使我连接到我的服务器,我也想检查我是否可以访问谷歌,而不是我的服务器。
2021-03-21 12:14:15
出于同样的原因,navigator.online/offline 也不可靠。参见stackoverflow.com/questions/3181080/...
2021-03-22 12:14:15
您可能想查看Offline.js,这是一个专门为此目的构建的开源库。
2021-04-01 12:14:15
撇开可靠性问题不谈(所有解决方案都存在该问题),navigator.onLine它绝对是最好的,因为它是跨浏览器的
2021-04-02 12:14:15
现在在 2012 年,您可以检查变量 navigator.onLine ;)
2021-04-05 12:14:15

几乎所有的主流浏览器都支持的window.navigator.onLine特性,以及相应onlineoffline窗口事件。运行以下代码片段进行测试:

console.log('Initially ' + (window.navigator.onLine ? 'on' : 'off') + 'line');

window.addEventListener('online', () => console.log('Became online'));
window.addEventListener('offline', () => console.log('Became offline'));

document.getElementById('statusCheck').addEventListener('click', () => console.log('window.navigator.onLine is ' + window.navigator.onLine));
<button id="statusCheck">Click to check the <tt>window.navigator.onLine</tt> property</button><br /><br />
Check the console below for results:

尝试将您的系统或浏览器设置为离线/在线模式,并检查日志或window.navigator.onLine属性的值更改。

但是请注意Mozilla 文档中的引用

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

在 Firefox 和 Internet Explorer 中,将浏览器切换到离线模式会发送一个false值。在 Firefox 41 之前,所有其他条件都返回一个true值;从 Firefox 41 开始,在 OS X 和 Windows 上,该值将遵循实际的网络连接。

(重点是我自己)

这意味着,如果window.navigator.onLinefalse(或者您收到一个offline事件),则保证您没有 Internet 连接。

true但是,如果是(或者您收到online事件),则充其量仅意味着系统已连接到某个网络。例如,这并不意味着您可以访问 Internet。要检查这一点,您仍然需要使用其他答案中描述的解决方案之一。

我最初打算将此作为对Grant Wagner 答案的更新发布,但似乎编辑太多了,尤其是考虑到 2014 年的更新已经不是他的

@imike 这取决于提问者,他已经有 10 多年没有活跃了:) 我希望能击败接受的答案,但不幸的是,这不会改变他们的顺序
2021-03-15 12:14:15
应该选择答案!
2021-03-18 12:14:15
当 VPN 已连接时,如果我们断开互联网连接,则 window.navigator.onLine 不起作用
2021-03-27 12:14:15
我最近有机会研究离线行为。这些事件很好用,但是 ios safari 会产生问题。当您在手机上关闭互联网时,离线/在线事件最多会延迟 2 秒,并且由于视觉渲染原因可能会出现问题,因为您无法预测未来。这只是我想提到的,可能会对某人有所帮助。
2021-04-04 12:14:15
@Sagar 我检查了 Firefox 和 Chrome,如果我在连接到我的工作 VPN 时拔掉电缆,它们都会很快检测到断开连接。他们不会等待 VPN 重新连接来报告在线状态——正如我在回答中指出的那样,这online只是意味着你有某种连接,而不是你可以访问互联网。我借此机会在我的答案中放了一个片段来测试它。
2021-04-09 12:14:15

IE 8 将支持window.navigator.onLine属性。

但这当然对其他浏览器或操作系统没有帮助。鉴于了解 Ajax 应用程序中在线/离线状态的重要性,我预测其他浏览器供应商也会决定提供该属性。

在此之前,XHR 或Image()or<img>请求都可以提供接近您想要的功能的东西。

更新 (2014/11/16)

现在主流浏览器都支持这个属性,但你的结果会有所不同。

引自Mozilla 文档

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

在 Firefox 和 Internet Explorer 中,将浏览器切换到离线模式会发送一个false值。所有其他条件都返回一个true值。

navigator.onLine 显示浏览器的状态,而不是实际的连接。因此,您可以将浏览器设置为在线,但实际上会因为连接断开而失败。navigator.onLine 只有在浏览器设置为离线浏览时才会为假。
2021-03-15 12:14:15
- 但不幸的是在早期版本的 IE 中不可用,我们经常需要支持。
2021-03-19 12:14:15
navigator.onLine 是 HTML5 的一部分——其他浏览器已经有提供它的开发版本——它已经在今天的 Firefox 3 中可用。
2021-03-21 12:14:15
如果我关闭 Nexus7 上的 WI-FI,页面仍会显示 navigator.onLine 为 TRUE。坏的...
2021-04-02 12:14:15
 if(navigator.onLine){
  alert('online');
 } else {
  alert('offline');
 }
好吧,首先我试图禁用 ONLY LAN,但它总是返回 TRUE。因此,当我禁用所有网络(LAN2、Virtual Box 等)时,它返回 FALSE。
2021-03-20 12:14:15
这个答案重复了 3 年前的几个现有答案。
2021-03-28 12:14:15
它不检查互联网连接,它只检查局域网连接
2021-04-03 12:14:15
在 HTML 5、JavaScript、mac book(使用 wifi)中为我工作,甚至在移动设备中工作。但问题是 - 当它上的 wifi 每次都返回 TRUE 时,即使我关闭 wifi,反之亦然。
2021-04-03 12:14:15
如果在浏览器上,它总是返回 TRUE。
2021-04-07 12:14:15

有多种方法可以做到这一点:

  • AJAX 请求到您自己的网站。如果该请求失败,则很有可能是连接有问题。JQuery的文件有一个部分处理失败的AJAX请求执行此操作时请注意同源策略,这可能会阻止您访问域外的站点。
  • 你可以把 an 放在 anonerrorimg,比如<img src="http://www.example.com/singlepixel.gif" onerror="alert('Connection dead');" />

如果移动/重命名源图像,此方法也可能失败,并且通常是 ajax 选项的次等选择。

所以有几种不同的方法来尝试和检测这个,没有一个完美的,但是在没有跳出浏览器沙箱并直接访问用户网络连接状态的能力的情况下,它们似乎是最好的选择。