¿Detecta que la conexión a Internet está fuera de línea?


¿Cómo detectar que la conexión a Internet está fuera de línea en JavaScript?

Author: Prakash Pazhanisamy, 2008-10-10

16 answers

Puede determinar que la conexión se pierde haciendo peticiones XHR fallidas.

El enfoque estándar es reintentar la solicitud unas cuantas veces. Si no funciona, avisa al usuario para que compruebe la conexión, y falla correctamente.

Nota lateral: Poner toda la aplicación en un estado "fuera de línea" puede llevar a una gran cantidad de trabajo propenso a errores de estado de manejo.. las conexiones inalámbricas pueden ir y venir, etc. Así que su mejor apuesta puede ser sólo falle correctamente, conserve los datos y alerte al usuario.. permitiéndoles eventualmente solucionar el problema de conexión si hay uno, y continuar usando su aplicación con una buena cantidad de perdón.

Nota lateral: Usted podría comprobar un sitio confiable como Google para la conectividad, pero esto puede no ser del todo útil como solo tratando de hacer su propia solicitud, porque mientras que Google puede estar disponible, su propia aplicación puede no ser, y usted todavía va a tener que manejar su propia conexión problema. Tratar de enviar un ping a Google sería una buena manera de confirmar que la conexión a Internet en sí está apagada, por lo que si esa información es útil para usted, entonces podría valer la pena el problema.

Sidenote: Enviar un Ping podría lograrse de la misma manera que haría cualquier tipo de solicitud ajax bidireccional, pero enviar un ping a Google en este caso plantearía algunos desafíos. En primer lugar, tendríamos los mismos problemas de dominios cruzados que se encuentran típicamente al hacer comunicaciones ajax. Una opción es configurar un proxy del lado del servidor, en el que realmente ping google (o cualquier sitio), y devolver los resultados del ping a la aplicación.. Este es un catch-22, porque si la conexión a Internet es realmente el problema, no podremos llegar al servidor, y si el problema de conexión es solo en nuestro propio dominio, no podremos notar la diferencia. Se pueden probar otras técnicas de dominios cruzados, por ejemplo, incrustar un iframe en su página que puntos a google.com, y luego sondear el iframe para el éxito / fracaso (examinar el contenido, etc.). Incrustar una imagen puede no decirnos nada, porque necesitamos una respuesta útil del mecanismo de comunicación para sacar una buena conclusión sobre lo que está pasando. Así que, una vez más, determinar el estado de la conexión a Internet en su conjunto puede ser más problemático de lo que vale la pena. Tendrás que sopesar estas opciones para tu aplicación específica.

 117
Author: keparo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-04 06:19:15

IE 8 soportará la ventana .navegador.En línea propiedad.

Pero, por supuesto, eso no ayuda con otros navegadores o sistemas operativos. Predigo que otros proveedores de navegadores decidirán proporcionar esa propiedad también dada la importancia de conocer el estado en línea/fuera de línea en las aplicaciones Ajax.

Hasta que eso suceda, ya sea XHR o una solicitud Image() o <img> puede proporcionar algo cercano a la funcionalidad que desea.

Actualizar (2014/11/16)

Los principales navegadores ahora admiten esta propiedad, pero sus resultados variarán.

Cita de Documentación de Mozilla :

En Chrome y Safari, si el navegador no puede conectarse a una red de área local (LAN) o un enrutador, está fuera de línea; todas las demás condiciones devuelven true. Por lo tanto, si bien puede asumir que el navegador está fuera de línea cuando devuelve un valor false, no puede asumir que un valor verdadero necesariamente significa que el navegador puede acceder al Internet. Podría estar obteniendo falsos positivos, como en los casos en que el equipo está ejecutando un software de virtualización que tiene adaptadores ethernet virtuales que siempre están "conectados"."Por lo tanto, si realmente desea determinar el estado en línea del navegador, debe desarrollar medios adicionales para verificar.

En Firefox e Internet Explorer, cambiar el navegador al modo sin conexión envía un valor false. Todas las demás condiciones devuelven un valor true.

 42
Author: Grant Wagner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-24 20:25:45

Hay varias maneras de hacer esto:

  • Solicitud AJAX a su propio sitio web. Si esa solicitud falla, hay una buena probabilidad de que sea la conexión la culpable. La documentación de jQuery tiene una sección sobre el manejo de solicitudes AJAX fallidas. Tenga cuidado con la Política del mismo Origen al hacer esto, que puede impedirle acceder a sitios fuera de su dominio.
  • Podrías poner un onerror en un img, como

    <img src='http://www.example.com/singlepixel.gif' 
          onerror='alert("Connection dead");' />
    

    Este método también podría fallar si el la imagen de origen se mueve / cambia de nombre, y generalmente sería una opción inferior a la opción ajax.

Así que hay varias maneras diferentes de tratar de detectar esto, ninguna perfecta, pero en ausencia de la capacidad de saltar fuera de la caja de arena del navegador y acceder al estado de la conexión de red del usuario directamente, parecen ser las mejores opciones.

 32
Author: ConroyP,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-09 22:52:20
 if(navigator.onLine){
  alert('online');
 } else {
  alert('offline');
 }
 24
Author: Edmhs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-09 04:45:29

La API de caché de aplicaciones HTML5 especifica navigator.En línea, que actualmente está disponible en el IE8 betas, WebKit (por ejemplo. Safari) nightlies, y ya es compatible con Firefox 3

 11
Author: olliej,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-09 23:24:05

Como dijo olliej, usar la propiedad del navegador navigator.onLine es preferible que enviar solicitudes de red y, en consecuencia, con developer.mozilla.org/En/Online_and_offline_events , incluso es compatible con versiones antiguas de Firefox e IE.

Recientemente, el WHATWG ha especificado la adición de los eventos online y offline, en caso de que necesite reaccionar a los cambios navigator.onLine.

Por favor, también preste atención al enlace publicado por Daniel Silveira que señala que confiar en aquellos señal / propiedad para sincronizar con el servidor no siempre es una buena idea.

 9
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-08-20 21:54:08

Puede usar $.ajax () 's error callback, que se activa si la solicitud falla. Si textStatus es igual a la cadena "timeout" probablemente significa que la conexión está rota:

function (XMLHttpRequest, textStatus, errorThrown) {
  // typically only one of textStatus or errorThrown 
  // will have info
  this; // the options for this ajax request
}

Del doc :

Error: Una función a ser llamada si la petición fallar. La función se pasa tres argumentos: El objeto XMLHttpRequest, una cadena que describe el tipo de error que se produjo y un opcional objeto de excepción, si se ha producido uno. Valores posibles para segundo argumento (además de null) son " timeout", "error", "no modificado" y "parsererror". Este es un evento Ajax

Por ejemplo:

 $.ajax({
   type: "GET",
   url: "keepalive.php",
   success: function(msg){
     alert("Connection active!")
   },
   error: function(XMLHttpRequest, textStatus, errorThrown) {
       if(textStatus == 'timeout') {
           alert('Connection seems dead!');
       }
   }
 });
 8
Author: karim79,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-06-10 11:54:44

Tuve que hacer una aplicación web (basada en ajax) para un cliente que trabaja mucho con las escuelas, estas escuelas tienen a menudo una mala conexión a Internet Utilizo esta sencilla función para detectar si hay una conexión, funciona muy bien!

Uso CodeIgniter y Jquery:

    function checkOnline(){
    setTimeout("doOnlineCheck()", 20000);
}

function doOnlineCheck(){
    var submitURL = $("#base_path").val() + "index.php/menu/online";//if the server can be reached it returns 1, other wise it times out
    $.ajax({
        url     : submitURL     ,
        type    : 'post'        ,
        dataType: 'msg'         ,
        timeout : 5000          ,
        success : function(msg){
            if(msg==1){
                $("#online").addClass("online");
                $("#online").removeClass("offline");
            }else{
                $("#online").addClass("offline");
                $("#online").removeClass("online");
            }
            checkOnline();
        }   ,
        error   : function(){
            $("#online").addClass("offline");
            $("#online").removeClass("online");
            checkOnline();
        }
    });
}
 4
Author: THEO,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-12 19:05:37

Una llamada ajax a tu dominio es la forma más fácil de detectar si estás desconectado

$.ajax({
      type: "HEAD",
      url: document.location.pathname + "?param=" + new Date(),
      error: function() { return false; },
      success: function() { return true; }
   });

Esto es solo para darle el concepto, debe ser mejorado, verifique los códigos de estado http devueltos, etc

 3
Author: harishr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-13 03:16:38

Creo que es una manera muy simple.

var x = confirm("Are you sure you want to submit?");
if(x){
    if(navigator.onLine == true) {
        return true;
    } else {
        alert('Internet connection is lost');
        return false; 
    }
}
else {
    return false;
}
 2
Author: Prakash Pazhanisamy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-03 10:56:14

Estaba buscando una solución del lado del cliente para detectar si Internet estaba caído o mi servidor estaba caído. Las otras soluciones que encontré siempre parecían depender de un archivo de script o imagen de terceros, que para mí no parecía que resistiría la prueba del tiempo. Un script o imagen alojada externa podría cambiar en el futuro y provocar un error en el código de detección.

He encontrado una manera de detectarlo buscando un xhrStatus con un código 404. Además, uso JSONP para evitar los CORS restricción. Un código de estado que no sea 404 muestra que la conexión a Internet no funciona.

$.ajax({
    url:      'https://www.bing.com/aJyfYidjSlA' + new Date().getTime() + '.html',
    dataType: 'jsonp',
    timeout:  5000,

    error: function(xhr) {
        if (xhr.status == 404) {
            //internet connection working
        }
        else {
            //internet is down (xhr.status == 0)
        }
    }
});
 1
Author: wayofthefuture,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-12 00:39:40

Script muy interesante que se reanuda una gran cantidad de arriba:

Http://www.codeproject.com/KB/scripting/InternetConnectionTest.aspx

Es muy útil, y debido a que está basado en Ajax, es asíncrono, por lo que puede comprobar si el Internet está conectado sin salir de la página original. Usando esto con un temporizador también puede tener un componente en la página comprobando cada n minutos.

 0
Author: backslash17,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-08-15 16:30:21

A mi manera.

<!-- the file named "tt.jpg" should exist in the same directory -->

<script>
function testConnection(callBack)
{
    document.getElementsByTagName('body')[0].innerHTML +=
        '<img id="testImage" style="display: none;" ' +
        'src="tt.jpg?' + Math.random() + '" ' +
        'onerror="testConnectionCallback(false);" ' +
        'onload="testConnectionCallback(true);">';

    testConnectionCallback = function(result){
        callBack(result);

        var element = document.getElementById('testImage');
        element.parentNode.removeChild(element);
    }    
}
</script>

<!-- usage example -->

<script>
function myCallBack(result)
{
    alert(result);
}
</script>

<a href=# onclick=testConnection(myCallBack);>Am I online?</a>
 0
Author: unxed,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-01 09:21:52

Hay 2 respuestas para esto para dos senarios diferentes: -

  1. Si está utilizando JavaScript en un sitio web (es decir, o cualquier parte del front-end) La forma más sencilla de hacerlo es:

    <h2>The Navigator Object</h2>
    
    <p>The onLine property returns true if the browser is online:</p>
    
    <p id="demo"></p>
    
    <script>
      document.getElementById("demo").innerHTML = "navigator.onLine is " + navigator.onLine;
    </script>
    

  2. Pero si está utilizando js en el lado del servidor (es decir; nodo, etc.), puede determinar que la conexión se pierde al realizar solicitudes XHR fallidas.

    El enfoque estándar es reintentar la solicitud unas cuantas veces. Si no se realiza, avise al usuario para que verifique la conexión, y fallan con gracia.

 0
Author: Rishabh Anand,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-23 08:45:02

Cabeza de solicitud en error de solicitud

$.ajax({
    url: /your_url,
    type: "POST or GET",
    data: your_data,
    success: function(result){
      //do stuff
    },
    error: function(xhr, status, error) {

      //detect if user is online and avoid the use of async
        $.ajax({
            type: "HEAD",
            url: document.location.pathname,
            error: function() { 
              //user is offline, do stuff
              console.log("you are offline"); 
              }
         });
    }   
});
 0
Author: Kareem,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-28 22:37:44

Aquí hay un fragmento de una utilidad auxiliar que tengo. Esto es javascript con espacio de nombres:

network: function() {
    var state = navigator.onLine ? "online" : "offline";
    return state;
}

Debe usar esto con la detección de métodos, de lo contrario, disparará una forma 'alternativa' de hacer esto. El tiempo se acerca rápidamente cuando esto será todo lo que se necesita. Los otros métodos son hacks.

 -2
Author: Peter Mortensen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-28 16:49:01