簡體   English   中英

如何在JavaScript中檢測互聯網連接是否斷開或域/ URL不存在?

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

問題:如何知道XMLHttpRequest是否由於互聯網連接斷開或請求的域不存在而失敗?

背景和上下文: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");
    }
}

現在的問題是,如果Internet連接已建立,我打電話

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

xhr.onerror處理程序將觸發並且狀態= 0,在線:false。

如果網絡連接斷開並且我撥打了相同的電話,則結果相同(狀態= 0,在線:false)。

換句話說,似乎無法確定所請求的URL或域是否不存在,或者網絡連接是否斷開?

盡管拋出了異常(在chrome控制台中看到),但xhr.send()周圍的try-catch塊實際上並未捕獲任何異常。

還代碼

navigator.isOnline

即使網絡連接沒有連接,Chrome瀏覽器擴展程序中似乎總是返回true,因此無法使用。

因此,我要么需要一種100%可靠的方法來確定Internet連接是否已建立,要么需要一種方法來在XMLHttpRequest中確定故障是由於網絡不可用還是域不存在而導致的。

如果不能使用XMLHttpRequest類確定域是否不存在或網絡連接是否斷開,則可能必須在每個“真實請求”之前檢查Internet連接。 確認! 由於谷歌在許多國家都被屏蔽,因此也無法使用例如www.google.com進行檢查。 www.microsoft.com可能還可以,但是我不喜歡這個想法。

有任何想法嗎?

如果我正確理解了這個問題,那么...您需要區分Internet斷開還是DNS錯誤。

基本上...您不能,嗯...不能不向其他地方提出其他要求。 您所能知道的是目的地不可達。 那是因為您實際上不能定義“互聯網已關閉”。 您如何定義? 如果無法通過網關,Internet就會關閉嗎? 如果我一個接一個又有兩個生根怎么辦? 還是3? 您說:如果我無法通過3個網關,則Internet斷開了? 那如果我有1000呢?

所以...您最大可以做的就是說:提出其他要求。 作為microsoft.com或example.net或其他任何內容,您可以發出更多請求,如果所有請求都失敗,則可以說所有請求都已失敗。 這使您可以說“如果我無法訪問其中任何一個,則表明互聯網已關閉”。 這確實不是100%可靠的,但可能滿足您的需求。

至於無效的目的地...同樣的問題。 目的地可能有效,但由於某些原因您可能無法到達。 原因可能包括:dns未完全傳播,路由已關閉等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM