Sprawdź, czy istnieje połączenie internetowe z Javascript? [duplikat]

To pytanie ma już odpowiedź tutaj:

Jak sprawdzić, czy istnieje połączenie z Internetem za pomocą Javascript? W ten sposób mogę mieć pewne warunki mówiąc: "używaj Google buforowanej wersji JQuery podczas produkcji, używaj albo tej, albo lokalnej wersji podczas rozwoju, w zależności na łączu internetowym".

Author: Prakash Pazhanisamy, 2010-03-05

9 answers

Najlepszym rozwiązaniem dla Twojego konkretnego przypadku może być:

Tuż przed Twoim Zamknięciem </body> tag:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<script>window.jQuery || document.write('<script src="js/vendor/jquery-1.10.2.min.js"><\/script>')</script>

Jest to prawdopodobnie najprostszy sposób, biorąc pod uwagę, że twój problem koncentruje się wokół jQuery.

Jeśli potrzebujesz bardziej solidnego rozwiązania, możesz spróbować:

var online = navigator.onLine;

Przeczytaj więcej o W3C spec on offline web apps , jednak należy pamiętać, że będzie to działać najlepiej w nowoczesnych przeglądarkach internetowych, robi to ze starszymi przeglądarkami internetowymi może nie działać zgodnie z oczekiwaniami lub w wszystkie.

Alternatywnie, żądanie XHR do własnego serwera nie jest tak złą metodą testowania łączności. Biorąc pod uwagę, że jedna z innych odpowiedzi stwierdza, że istnieje zbyt wiele punktów awarii dla XHR, jeśli twój XHR jest wadliwy podczas ustanawiania połączenia, to będzie również wadliwy podczas rutynowego użytkowania. Jeśli Twoja witryna jest nieosiągalna z jakiegokolwiek powodu, inne usługi działające na tych samych serwerach prawdopodobnie również będą nieosiągalne. Decyzja ta należy do ty.

Nie polecam składania prośby o XHR do czyjegoś Serwisu, nawet google.com jeśli o to chodzi. Złóż wniosek na swój serwer, lub wcale.

Co to znaczy być "online"?

Wydaje się być pewne zamieszanie wokół tego, co oznacza bycie "online". Rozważ, że internet to kilka sieci, jednak czasami jesteś w sieci VPN, bez dostępu do Internetu "na ogół" lub world wide web. Często firmy mają własne sieci, które mają ograniczona łączność z innymi sieciami zewnętrznymi, dlatego możesz zostać uznany za "online". Bycie online oznacza tylko to, że jesteś połączony z siecią, a nie dostępność ani dostępność usług, z którymi próbujesz się połączyć.

Aby określić, czy host jest dostępny z twojej sieci, możesz to zrobić:

function hostReachable() {

  // Handle IE and more capable browsers
  var xhr = new ( window.ActiveXObject || XMLHttpRequest )( "Microsoft.XMLHTTP" );
  var status;

  // Open new request as a HEAD to the root hostname with a random param to bust the cache
  xhr.open( "HEAD", "//" + window.location.hostname + "/?rand=" + Math.floor((1 + Math.random()) * 0x10000), false );

  // Issue request and handle response
  try {
    xhr.send();
    return ( xhr.status >= 200 && (xhr.status < 300 || xhr.status === 304) );
  } catch (error) {
    return false;
  }

}

Możesz również znaleźć streszczenie tego tutaj: https://gist.github.com/jpsilvashy/5725579

Szczegóły na lokalnym realizacja

Niektórzy ludzie skomentowali: "zawsze zwracają mi się fałszywi". To dlatego, że prawdopodobnie testujesz go na swoim lokalnym serwerze. Niezależnie od tego, na jakim serwerze składasz żądanie, musisz być w stanie odpowiedzieć na żądanie HEAD, które oczywiście można zmienić na GET, jeśli chcesz.

 246
Author: Joseph Silvashy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-17 19:53:45

Ok, może trochę za późno w grze, ale co z sprawdzeniem obrazu online? Chodzi mi o to, że OP musi wiedzieć, czy musi pobrać CMD Google lub lokalną kopię JQ, ale to nie znaczy, że przeglądarka nie może czytać Javascript bez względu na wszystko, prawda?

<script>
function doConnectFunction() {
// Grab the GOOGLE CMD
}
function doNotConnectFunction() {
// Grab the LOCAL JQ
}

var i = new Image();
i.onload = doConnectFunction;
i.onerror = doNotConnectFunction;
// CHANGE IMAGE URL TO ANY IMAGE YOU KNOW IS LIVE
i.src = 'http://gfx2.hotmail.com/mail/uxp/w4/m4/pr014/h/s7.png?d=' + escape(Date());
// escape(Date()) is necessary to override possibility of image coming from cache
</script>
Tylko moje 2 centy]}
 36
Author: morespace54,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-14 20:03:13

5 lata później-wersja:

Dzisiaj, istnieją biblioteki JS dla Ciebie, jeśli nie chcesz wdawać się w szczegóły różnych metod opisanych na tej stronie.

Na nich jest https://github.com/hubspot/offline . sprawdza łączność predefiniowanego URI, domyślnie favicon. Automatycznie wykrywa, kiedy łączność użytkownika została przywrócona i zapewnia schludne zdarzenia, takie jak up i down, które można powiązać w celu Zaktualizuj swój interfejs użytkownika.

 12
Author: Phil Rykoff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-24 22:02:04

Możesz naśladować polecenie Ping.

Użyj Ajax, aby zażądać znacznika czasu do własnego serwera, zdefiniuj timer za pomocą setTimeout na 5 sekund, jeśli nie ma odpowiedzi spróbuj ponownie.

Jeśli nie ma odpowiedzi w 4 próbach, można przypuszczać, że internet nie działa.

Więc można sprawdzić za pomocą tej procedury w regularnych odstępach czasu, jak 1 lub 3 minuty.

To wydaje mi się dobre i czyste rozwiązanie.

 5
Author: Vitim.us,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-21 16:28:16

Możesz spróbować wysyłając żądania XHR kilka razy, a jeśli pojawią się błędy, oznacza to, że jest problem z połączeniem internetowym.

Edytuj: znalazłem Ten skrypt JQuery {[7] } który robi to, o co prosisz, nie testowałem go jednak.

 1
Author: Soufiane Hassou,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-05 02:43:59

Napisałem do tego wtyczkę jQuery. Domyślnie sprawdza bieżący adres URL (ponieważ jest już załadowany raz z sieci) lub można określić adres URL, który ma być użyty jako argument. Zawsze robi żądanie do Google nie jest najlepszym pomysłem, ponieważ jest zablokowany w różnych krajach w różnych czasach. Możesz też być na łasce tego, jak może wyglądać połączenie za określonym oceanem/frontem pogodowym/klimatem politycznym dzień.

Http://tomriley.net/blog/archives/111

 0
Author: tripRev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-03 13:00:37

Wysyłanie żądań XHR jest złe, ponieważ może się nie udać, jeśli dany serwer jest wyłączony. Zamiast tego użyj biblioteki googles API, aby załadować ich buforowane wersje jQuery.

Możesz użyć googles API do wykonania wywołania zwrotnego po załadowaniu jQuery, a to sprawdzi, czy jQuery został załadowany pomyślnie. Coś takiego jak poniższy kod powinien działać:

<script type="text/javascript">
    google.load("jquery");

    // Call this function when the page has been loaded
    function test_connection() {
        if($){
            //jQuery WAS loaded.
        } else {
            //jQuery failed to load.  Grab the local copy.
        }
    }
    google.setOnLoadCallback(test_connection);
</script>

Dokumentacja google API znajduje się tutaj .

 -3
Author: Mike Trpcic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-05 02:32:19

Mam rozwiązanie, które sprawdza czy istnieje połączenie z internetem:

$.ajax({
    url: "http://www.google.com",
    context: document.body,
    error: function(jqXHR, exception) {
        alert('Offline')
    },
    success: function() {
        alert('Online')
    }
})
 -3
Author: Mistermika,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-13 13:02:05

O wiele prostsze rozwiązanie:

<script language="javascript" src="http://maps.google.com/maps/api/js?v=3.2&sensor=false"></script>

I później w kodzie:

var online;
// check whether this function works (online only)
try {
  var x = google.maps.MapTypeId.TERRAIN;
  online = true;
} catch (e) {
  online = false;
}
console.log(online);

Gdy nie jest on-line, skrypt google nie zostanie załadowany, co spowoduje błąd, w którym zostanie wyrzucony wyjątek.

 -8
Author: web site maker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-17 19:06:48