navigator.onLine
注意
这种方式只支持Web环境
NetWork API:http://wicg.github.io/netinfo/
navigator.onLine只会在机器未连接到局域网或路由器时返回false,其他情况下均返回true。
也就是说,机器连接上路由器后,即使这个路由器没联通网络,navigator.onLine仍然返回true。
判断网络连接的网络状态
1  | if (navigator.onLine) {  | 
想要监听浏览器的联网状态, 使用window.onOnline和window.onOffline事件:
1  | window.addEventListener("offline", function(e) {alert("offline");})  | 
更为安全的做法:
1  | var el = document.body;  | 
注意,检测ononline事件,要绑定在window对象上
attachEvent——兼容:IE7、IE8;不兼容firefox、chrome、IE9、IE10、IE11、safari、opera
addEventListener——兼容:firefox、chrome、IE、safari、opera;不兼容IE7、IE8
is-online(Web推荐)
注意
这种方式同时支持NodeJS和Web环境
安装依赖
1  | npm install is-online --save  | 
工具类
1  | const isOnline = require('is-online');  | 
internet-available(NodeJS推荐)
注意
这种方式只支持NodeJS环境
相比于
is-online,这个可以自定义DNS服务器的地址,这样不会因为使用国外的地址而导致网络状态判断不正确。
这个库检测因特网连接状态原理,是检测dns连接状态。
这里大家肯定有个疑问,使用nodejs原生模块dns不是更简洁吗?
你说的没错,nodejs确实提供这样的方法,但是dns原生模块并没有提供超时检测。internet-available可以设置超时参数,默认是5000ms
安装依赖
1  | npm install internet-available --save  | 
示例代码
1  | const internetAvailable = require("internet-available");  | 
注意
端口53不是网址的端口是DNS服务的端口,DNS 协议运行在 UDP 协议之上,使用 端口号53 。
超时时间和重试次数
1  | var internetAvailable = require("internet-available");  | 
默认值在源码中可以看到
1  | var socket = dns({  | 
默认
- 超时时间:5秒
 - 重试次数:5
 - 域名:google.com
 - 端口:53
 - DNS:8.8.8.8