[英]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.