navigator.onLine 并不总是有效

IT技术 javascript
2021-01-27 10:10:41

我遇到了 navigator.onLine 属性的问题。

我正在从在 WAMP 上运行的本地信息亭运行一个简单的网站。

在我的笔记本电脑上,当我测试它时,它可以工作。我关闭了 WiFi 并且出现了警告框。在运行 WAMP 软件的信息亭上断开互联网连接不会产生错误状态。任何想法为什么?

var online = navigator.onLine;

if (online == false) {

    alert("Sorry, we currently do not have Internet access.");
    location.reload();

}
2个回答

MDN 关于navigator.onLine

在 Chrome 和 Safari 中,如果浏览器无法连接到局域网(LAN)或路由器,则为离线;所有其他条件返回真。因此,虽然您可以假设浏览器在返回假值时离线,但您不能假设真值必然意味着浏览器可以访问互联网。

如上所述,此属性不可信,因此,在我看来,最好的解决方法是对服务器端页面进行 ajax 调用。如果浏览器离线,则连接将失败,因此onerror将调用事件。否则,该onload事件将被调用:

function isOnline(no,yes){
    var xhr = XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHttp');
    xhr.onload = function(){
        if(yes instanceof Function){
            yes();
        }
    }
    xhr.onerror = function(){
        if(no instanceof Function){
            no();
        }
    }
    xhr.open("GET","anypage.php",true);
    xhr.send();
}

isOnline(
    function(){
        alert("Sorry, we currently do not have Internet access.");
    },
    function(){
        alert("Succesfully connected!");
    }
);
如果我想从谷歌的 CDN 加载 jQuery,如果请求成功就执行 jQuery 代码怎么办?
2021-03-24 10:10:41
我想补充一点,如果您想检查除您自己的网站(已进行调用的网站)之外的任何其他网站,例如 from www.YourSite.comto https//:google.com,那么如果目标网站 ( google.com) 不接受,则会引发错误Cross Site Calls如果我错了,请纠正我。
2021-03-24 10:10:41
然后你应该把你的逻辑放在成功回调中(如果是yes函数)。
2021-03-25 10:10:41
也可以调用jQuery.ajax,然后监听error:function(x,e)。如果 x.status ===0 表示网络有问题,可能下线
2021-03-27 10:10:41
小更正 - 参数中的函数顺序被交换,应该是 function isOnline(yes, no){ ... }
2021-04-08 10:10:41

如果您使用的是axios

axios.request(options).catch(function(error) {
  if (!error.response) {
    // network error (server is down or no internet)
  } else {
    // http status code
    const code = error.response.status
    // data from server while error
    const response = error.response.data
  }
});