如何在JavaScript中检测互联网连接是否已关闭或域/ URL是否不存在?

时间:2014-05-06 21:05:32

标签: javascript ajax google-chrome xmlhttprequest

问题:如何知道XMLHttpRequest是否由于互联网连接中断或请求的域名不存在而失败?

背景& context:Chrome扩展程序可以向任何域发出XHttpRequests。

代码:

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处理程序触发并且状态= 0,在线:false。

如果网络连接是DOWN并且我进行相同的呼叫,结果是相同的(status = 0,online:false)。

换句话说,似乎无法确定所请求的URL或域是否不存在或者网络连接是否已关闭?

xhr.send()周围的try-catch块实际上并没有捕获任何异常,尽管引发了异常(在chrome控制台中看到)。

也是代码

navigator.isOnline

似乎总是在Chrome扩展程序中返回true,尽管网络连接未启动,因此无法使用。

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

如果XMLHttpRequest类不能用于确定域是否存在或网络连接是否已关闭,我可能必须在每次“实际请求”之前检查Internet连接。确认!也使用例如www.google.com检查它是不会做的,因为谷歌在许多国家被封锁。 www.microsoft.com可能没事,但不知何故我讨厌这个想法。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

如果我正确地理解了这个问题......你需要区分互联网,或错误的DNS。

基本上......你不能......好吧......不要再向其他地方提出另一个请求。您只能知道目的地无法到达。那是因为你实际上无法定义互联网已经失败了#34;你是如何定义的?如果我不能通过我的网关,互联网就会倒闭?如果我一个接一个地有2个rooter怎么办?还是3?你说:如果我不能通过3个网关,互联网就会倒闭吗?如果我有1000个怎么办?

所以......你能做的最多就是你所说的:向其他人提出要求。作为microsoft.com,或者example.net,或者其他什么......你可以提出更多请求,如果一切都失败了,那么你可以说一切都失败了。这允许你说"如果我无法达到其中任何一个,那么互联网就会崩溃"。这确实不是100%可靠,但可能符合您的需求。

关于无效目的地......同样的问题。目的地可能有效但由于某种原因可能无法访问您。原因可能包括:dns未完全传播,路线已关闭等等。