¿Cómo detectar que la conexión a Internet está fuera de línea en JavaScript?
javascript
ajax
offline
connectivity
internet-connection
Daniel Silveira
fuente
fuente
Respuestas:
Puede determinar que la conexión se pierde haciendo solicitudes XHR fallidas .
El enfoque estándar es volver a intentar la solicitud varias veces. Si no pasa, alerta al usuario para que verifique la conexión y falla con gracia .
Nota al margen: Poner toda la aplicación en un estado "fuera de línea" puede llevar a una gran cantidad de trabajo de manejo de estado propenso a errores ... las conexiones inalámbricas pueden ir y venir, etc. Así que su mejor opción puede ser simplemente fallar con gracia, preservar el datos y alertar al usuario .. permitiéndole eventualmente solucionar el problema de conexión si existe, y continuar usando su aplicación con una buena cantidad de perdón.
Nota al margen: puede verificar la conectividad de un sitio confiable como google, pero esto puede no ser del todo útil simplemente tratando de hacer su propia solicitud, porque si bien Google puede estar disponible, su propia aplicación puede no estarlo, y usted todavía va a tiene que manejar su propio problema de conexión. Intentar enviar un ping a Google sería una buena manera de confirmar que la conexión a Internet en sí misma no funciona, por lo que si esa información es útil para usted, entonces podría valer la pena.
Nota al margen : el envío de un Ping se podría lograr 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. Primero, tendríamos los mismos problemas de dominio cruzado que normalmente se encuentran al hacer comunicaciones Ajax. Una opción es configurar un proxy del lado del servidor, en el que en realidad buscamos en
ping
Google (o en cualquier sitio), y devolvemos los resultados del ping a la aplicación. Esta es una trampa-22porque si la conexión a Internet es realmente el problema, no podremos acceder al servidor, y si el problema de conexión es solo en nuestro propio dominio, no podremos notar la diferencia. Se podrían probar otras técnicas de dominio cruzado, por ejemplo, incrustando un iframe en su página que apunte a google.com, y luego sondeando el iframe por éxito / fracaso (examine el contenido, etc.). Incrustar una imagen puede no decirnos nada realmente, porque necesitamos una respuesta útil del mecanismo de comunicación para sacar una buena conclusión sobre lo que está sucediendo. De nuevo, determinar el estado de la conexión a Internet en su conjunto puede ser más problemático de lo que vale. Tendrá que sopesar estas opciones para su aplicación específica.fuente
IE 8 admitirá la propiedad window.navigator.onLine .
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 ocurra, ya sea XHR o un
Image()
o<img>
solicitud pueden proporcionar algo cercano a la funcionalidad que desea.Actualización (2014/11/16)
Los principales navegadores ahora admiten esta propiedad, pero sus resultados variarán.
Cita de la documentación de Mozilla :
fuente
Casi todos los principales navegadores ahora admiten la
window.navigator.onLine
propiedad y los eventos correspondientesonline
y deoffline
ventana:Intente configurar su sistema o navegador en modo fuera de línea / en línea y verifique la consola o la
window.navigator.onLine
propiedad para ver los cambios de valor. También puede probarlo en este sitio web .Sin embargo, tenga en cuenta esta cita de la documentación de Mozilla :
(el énfasis es mío)
Esto significa que si
window.navigator.onLine
es asífalse
(o si obtiene unoffline
evento), se garantiza que no tendrá conexión a Internet.true
Sin embargo, si es así (o si obtiene unonline
evento), solo significa que el sistema está conectado a alguna red, en el mejor de los casos. No significa que tenga acceso a Internet, por ejemplo. Para verificar eso, aún necesitará usar una de las soluciones descritas en las otras respuestas.Inicialmente tenía la intención de publicar esto como una actualización de la respuesta de Grant Wagner , pero parecía demasiado editado, especialmente teniendo en cuenta que la actualización de 2014 ya no era de él .
fuente
Hay muchas maneras de hacer esto:
Podrías poner
onerror
unimg
, comoEste método también podría fallar si la imagen de origen se mueve / cambia de nombre, y generalmente sería una opción inferior a la opción ajax.
Por lo tanto, hay varias formas diferentes de intentar detectar esto, ninguna perfecta, pero en ausencia de la capacidad de saltar del entorno limitado del navegador y acceder directamente al estado de conexión de red del usuario, parecen ser las mejores opciones.
fuente
fuente
La API de caché de aplicaciones HTML5 especifica navigator.onLine, que actualmente está disponible en las versiones beta de IE8, WebKit (por ejemplo, Safari), y ya es compatible con Firefox 3
fuente
Puede usar la devolución de llamada de $ .ajax ()
error
, que se activa si la solicitud falla. SitextStatus
es igual a la cadena "tiempo de espera", probablemente significa que la conexión está interrumpida:Del documento :
Así por ejemplo:
fuente
Como dijo olliej,
navigator.onLine
es preferible usar la propiedad del navegador 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
yoffline
, en caso de que necesite reaccionar antenavigator.onLine
cambios.También preste atención al enlace publicado por Daniel Silveira que señala que confiar en esas señales / propiedades para sincronizar con el servidor no siempre es una buena idea.
fuente
es lo que está buscando, pero aquí hay algunas cosas que agregar, primero, si es algo en su aplicación que desea seguir verificando (como ver si el usuario se desconecta repentinamente, lo cual es correcto en este caso la mayor parte del tiempo, luego usted necesita escuchar el cambio también), para eso agrega un escucha de eventos a la ventana para detectar cualquier cambio, para verificar si el usuario se desconecta, puede hacer:
y para verificar si está en línea:
fuente
onLine
. Los navegadores definen el estado de estar en línea de manera muy diferente. Echa un vistazo a developer.mozilla.org/en-US/docs/Web/API/NavigatorOnLine/onLine .Tuve que hacer una aplicación web (basada en ajax) para un cliente que trabaja mucho con las escuelas, estas escuelas a menudo tienen una mala conexión a Internet. ¡Utilizo esta función simple para detectar si hay una conexión, funciona muy bien!
Yo uso CodeIgniter y Jquery:
fuente
Una llamada ajax a su dominio es la forma más fácil de detectar si está desconectado
esto es solo para darle el concepto, debería mejorarse.
Por ejemplo, error = 404 aún debería significar que estás en línea
fuente
Creo que es una forma muy simple.
fuente
if the browser is not able to connect to a local area network (LAN) or a router, it is offline; all other conditions return true
Estaba buscando una solución del lado del cliente para detectar si Internet estaba caído o si mi servidor estaba caído. Las otras soluciones que encontré siempre parecían depender de un archivo o imagen de script de un tercero, lo que para mí no parecía resistir el paso del tiempo. Una imagen o script alojado externo 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 la restricción CORS. Un código de estado que no sea 404 muestra que la conexión a Internet no funciona.
fuente
Mi manera.
fuente
El problema de algunos métodos
navigator.onLine
es que no son compatibles con algunos navegadores y versiones móviles, una opción que me ayudó mucho fue usar elXMLHttpRequest
método clásico y también prever el posible caso de que el archivo se almacenara en caché con respuestaXMLHttpRequest.status
mayor que 200 y menos de 304.Aquí está mi código:
fuente
Hay dos respuestas para dos senarios diferentes:
Si está utilizando JavaScript en un sitio web (es decir, o en cualquier parte frontal) La forma más sencilla de hacerlo es:
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 volver a intentar la solicitud varias veces. Si no pasa, alerta al usuario para que verifique la conexión y falla con gracia.
fuente
cabeza de solicitud en error de solicitud
fuente
Aquí hay un fragmento de una utilidad auxiliar que tengo. Este es JavaScript de espacio de nombres:
Debería usar esto con la detección de métodos; de lo contrario, active una forma 'alternativa' de hacerlo. Se acerca rápidamente el momento en que esto será todo lo que se necesita. Los otros métodos son hacks.
fuente