2014-06-09 41 views
6

當用戶嘗試登錄沒有互聯網連接,我只需要檢查他/她是否連接到互聯網或沒有。如何檢查用戶有互聯網連接,使用angularJs

我嘗試下面的代碼:

if (status == '404') { 
    $scope.error="No internet connection"; 
    return false; 
} 

但這種狀態404來,即使我的Web服務連接失敗。我需要區分兩者,如果是用戶的互聯網連接問題或Web服務連接問題。

+2

您可以使用'navigator.onLine' javascript函數或爲此編寫一個服務,勾選[此鏈接](https://developer.mozilla.org/en-US/docs/Web/API/NavigatorOnLine),因爲這只是一個骯髒的測試來檢查連接,你也可以[模擬一個AJAX請求](http://stackoverflow.com/a/2384227/1431600)。 –

+0

@EvandroSilva:它工作一些,有些時候不..如果禁用網絡它的工作原理,如果我斷開我的有線互聯網連接,它將無法正常工作。 –

回答

9

使用navigator.onLine

您可以使用navigator.onLine,敷於輔助變量,像這樣(Credits to this answer

myApp.run(function($window, $rootScope) { 
     $rootScope.online = navigator.onLine; 
     $window.addEventListener("offline", function() { 
     $rootScope.$apply(function() { 
      $rootScope.online = false; 
     }); 
     }, false); 
     $window.addEventListener("online", function() { 
     $rootScope.$apply(function() { 
      $rootScope.online = true; 
     }); 
     }, false); 
}); 

然後在控制器中觀看它:

$scope.$watch('online', function(newStatus) { ... }); 

,只是作爲一個骯髒的檢查,以瞭解PC是否實際連接到網絡,並不意味着互聯網正在工作。

使用假AJAX請求

你可以嘲笑,做給瀏覽器的假請求的服務(警告:以下非測試代碼)

myApp.service('Internet', function($http){ 
    this.IsOk = function() { 
    return $http({ method: 'HEAD', url: '/' + window.location.hostname + "/?rand=" + Math.floor((1 + Math.random()) * 0x10000) }) 
    .then(function(response) { 
     var status = response.status; 
     return status >= 200 && status < 300 || status === 304; 
    }); 
    } 
}); 

而且然後在這方面使用一些東西:

myApp.controller('TestController', function(Internet){ 

    Internet.IsOn().then(function(isok){ 
    if(isok) {...} else {...} 
    }); 

}); 

請求嘲笑代碼this link

還要注意,它不會使用localhost,因爲服務器即使在斷開連接到互聯網時也能工作。

+0

爲什麼這些響應代碼呢? 200到300和304? 我曾想過一些4X代碼也適用,例如404 –

1

有一個JavaScript性能,navigator.onLine,它返回一個Boolean值,指定羯羊瀏覽器爲在線模式或離線模式。

navigator對象包含有關用戶瀏覽器的信息。

它支持所有主流瀏覽器,所以你根本沒有任何問題。

+1

如果*支持所有主流瀏覽器*你的意思是[這種不一致的行爲](http://stackoverflow.com/a/13076434/542251)然後... – Liam

2

取自MDN的摘要NavigatorOnLine.onLine

瀏覽器以不同方式實現此屬性。

在Chrome和Safari中,如果瀏覽器無法連接到本地局域網(LAN)或路由器,則它處於脫機狀態;所有其他條件 返回true。因此,儘管您可以假設瀏覽器處於脫機狀態,但它返回的值爲假,但不能假定真實值 必然意味着瀏覽器可以訪問互聯網。如果計算機運行的虛擬軟件具有虛擬以太網適配器 ,且虛擬化軟件始終「連接」,您可能會收到誤報,例如計算機爲 。因此,如果您確實想要確定瀏覽器的在線狀態,您應該開發 其他檢查手段。要了解更多信息,請參閱HTML5 Rocks 文章,關閉網格。

在Firefox和Internet Explorer中,將瀏覽器切換到離線模式 將發送一個錯誤值。所有其他條件都會返回真實值。

通過監聽window.onOnline和window.onOffline上的事件 ,您可以看到網絡狀態的變化。

您可以通過window.navigator.onLine訪問該信息,但正如文檔所述,它是非常不一致的跨瀏覽器。

您也可以監聽使用window.addEventListener狀態更改如下:

window.addEventListener("offline", function(e) {alert("offline");}) 

window.addEventListener("online", function(e) {alert("online");}) 
+0

它的作品一些,有些時候不..如果禁用網絡它工程,如果我斷開我的有線互聯網連接,它將無法正常工作。 –