如何在JavaScript中检测互联网连接是否断开或域名/URL不存在

How to detect in JavaScript whether internet connection is down or domain/URL is non-existent?

本文关键字:断开 域名 不存在 URL 是否 连接 JavaScript 互联网 检测      更新时间:2023-09-26

问题:我如何知道XMLHttpRequest失败是因为互联网连接断开还是因为请求的域不存在?

的背景,上下文:Chrome扩展,可以使xhttprequest到任何域。

代码:

function isOnline(url, callback)
{
    var xhr = new XMLHttpRequest();
    var result = {status: 0, online: true};
    xhr.onerror = function(data) { 
        // note! data object here doesn't contain any useful info about the reason
        result.online = false;
    };
    xhr.onreadystatechange = function(data) {
        if (xhr.readyState == 4) 
        {
            result.status = xhr.status;
            result.message = xhr.statusText;
            // timeout is needed since onerror is processed AFTER onreadystatechange
            setTimeout(function() { callback(result) }, 100);
        }
    };
    xhr.open('HEAD', url + "?rand=" + Math.random(), true);
    try
    {
        xhr.send();
    }
    catch(error)
    {
        console.log("This line is never shown");
    }
}

现在的问题是,如果网络连接是UP的,我调用

isOnline("http://www.nonexistentdomain.com", function(result) { console.log(result); });

xhr。Onerror处理程序触发并且status = 0, online: false.

如果网络连接是DOWN,我拨打同样的电话,结果是一样的(status = 0, online: false)

换句话说,似乎不可能确定所请求的URL或域是否不存在,或者网络连接是否断开?

xhr.send()周围的try-catch块实际上并不捕获任何异常,尽管会抛出异常(在chrome控制台中看到)。

还代码

navigator.isOnline

在Chrome扩展中似乎总是返回true,即使网络连接没有打开,所以不能使用。

所以我要么需要一个100%可靠的方法来确定互联网连接是否正常,要么在XMLHttpRequest中找出失败是由于不可用的网络还是域名不存在的事实。

如果XMLHttpRequest类不能用于确定域是否不存在或网络连接断开,我可能必须在每个"真实请求"之前检查互联网连接。Ack !也使用例如www.google.com来检查它不会做,因为谷歌在许多国家被屏蔽。www.microsoft.com可能还行,但不知怎么的,我讨厌这个主意。

任何想法?

如果我理解正确的话…您需要区分互联网故障,或错误的dns。

基本上……你不能,嗯……除非向其他地方提出另一个要求。你所能知道的就是目的地遥不可及。这是因为你无法真正定义"互联网断了"。你是怎么定义的?如果我不能通过我的网关上网就会断网吗?如果有两个支持者一个接一个呢?还是3 ?你说:如果我不能通过3个网关,网络就断了?如果有1000呢?

所以…你最多能做的就是你说过的:向其他事情提出请求。比如microsoft.com,或者example.net等等。你可以提出更多的请求,如果所有的都失败了,那么你可以说所有的都失败了。这允许你说"如果我无法连接到其中任何一个,那么网络就断了"。这确实不是100%可靠,但可能符合您的需要。

关于无效目的地…同样的问题。目的地可能是有效的,但由于某些原因,您可能无法到达。原因可能包括:dns未完全传播,路由关闭等