Daniel Silveira
¿Cómo puedo detectar si la conexión a Internet está fuera de línea en JavaScript?
didier l
Casi todos los principales navegadores ahora apoya el window.navigator.onLine
propiedad, y la correspondiente online
y offline
eventos de ventana Ejecute el siguiente fragmento de código para probarlo:
console.log('Initially ' + (window.navigator.onLine ? 'on' : 'off') + 'line');
window.addEventListener('online', () => console.log('Became online'));
window.addEventListener('offline', () => console.log('Became offline'));
document.getElementById('statusCheck').addEventListener('click', () => console.log('window.navigator.onLine is ' + window.navigator.onLine));
<button id="statusCheck">Click to check the <tt>window.navigator.onLine</tt> property</button><br /><br />
Check the console below for results:
Intente configurar su sistema o navegador en modo fuera de línea/en línea y verifique el registro o el window.navigator.onLine
propiedad para los cambios de valor.
Nótese sin embargo esta 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 regresan
true
. así que mientras puede suponer que el navegador está fuera de línea cuando devuelve unfalse
valor, no puedes asumir que untrue
valor significa necesariamente que el navegador puede acceder a Internet. Es posible que obtenga falsos positivos, como en los casos en que la computadora ejecuta 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 fuera de línea envía un
false
valor. Hasta Firefox 41, todas las demás condiciones devuelven untrue
valor; desde Firefox 41, en OS X y Windows, el valor seguirá la conectividad de red real.
(el subrayado es mío)
Esto significa que si window.navigator.onLine
es false
(o obtienes un offline
evento), se garantiza que no tendrá conexión a Internet.
Si esto es true
sin embargo (o obtienes un online
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 deberá 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 una edición demasiado grande, especialmente teniendo en cuenta que la actualización de 2014 ya no era de él.
-
Recientemente tuve la oportunidad de trabajar un poco en el comportamiento fuera de línea. Los eventos son geniales para usar, PERO ios safari creará problemas. Cuando apaga Internet en su teléfono, los eventos fuera de línea/en línea se retrasarán hasta 2 segundos y eso puede ser problemático por razones de representación visual, ya que no puede predecir el futuro. Eso es algo que quería mencionar y podría ayudar a alguien.
– TeeJaay
27 de mayo de 2020 a las 4:56
-
Mientras vpn está conectado, si desconectamos Internet, window.navigator.onLine no funciona
– Sagar
16 de abril de 2021 a las 14:04
-
@Sagar Revisé en Firefox y Chrome, si desconecto el cable mientras estoy conectado a mi VPN de trabajo, ambos detectan rápidamente la desconexión. Sin embargo, no esperan a que la VPN se vuelva a conectar para informar un estado en línea, como indiqué en la respuesta,
online
solo significa que tiene algún tipo de conexión, no que tenga acceso a Internet. Aproveché esta oportunidad para poner un fragmento en mi respuesta para probarlo.– Didier L.
16 abr 2021 a las 14:36
-
Debe ser la respuesta seleccionada!
– imike
1 de junio de 2021 a las 16:58
-
@imike Eso depende de la persona que hizo la pregunta, y no ha estado activo en más de 10 años 🙂 Tengo la esperanza de superar la respuesta aceptada, pero desafortunadamente eso no cambiará su orden.
– Didier L.
1 jun 2021 a las 17:40
képaro
Puede determinar que la conexión se ha perdido haciendo solicitudes XHR fallidas.
El enfoque estándar es reintentar la solicitud unas pocas veces. Si no pasa, alertar al usuario para comprobar la conexión, y fallar con gracia.
Nota al margen: Poner toda la aplicación en un estado “fuera de línea” puede conducir a una gran cantidad de trabajo propenso a errores de manejo del estado… las conexiones inalámbricas pueden aparecer y desaparecer, etc. y alertar al usuario… permitiéndole eventualmente solucionar el problema de conexión si lo hay, 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 para tratar de hacer su propia solicitud, porque si bien Google puede estar disponible, su propia aplicación puede no estarlo, y aún tendrá que hacerlo. 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 no funciona, por lo que si esa información es útil para usted, entonces podría valer la pena.
Nota al margen: 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 entre dominios que normalmente se encuentran al realizar comunicaciones Ajax. Una opción es configurar un proxy del lado del servidor, en el que en realidad ping
Google (o cualquier sitio) y devolver los resultados del ping a la aplicación. Esto es un 22 capturas porque 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 pueden probar otras técnicas de dominio cruzado, por ejemplo, incrustar un iframe en su página que apunte a google.com, y luego sondear el iframe para el éxito/fracaso (examinar el contenido, etc.). Es posible que incrustar una imagen no nos diga nada, porque necesitamos una respuesta útil del mecanismo de comunicación para sacar una buena conclusión sobre lo que está pasando. Entonces, nuevamente, 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.
-
Ahora en 2012 puedes consultar la variable navigator.onLine 😉
– João Pinto Jerónimo
23 de abril de 2012 a las 9:13
-
navigator.online/offline tampoco es confiable, por las mismas razones. Ver stackoverflow.com/questions/3181080/…
– Efran Cobisi
11 de septiembre de 2012 a las 14:06
-
Es posible que desee comprobar Desconectado.jsuna biblioteca de código abierto construida solo para este propósito.
– Adán
27/10/2013 a las 22:31
-
Dejando a un lado los problemas de confiabilidad (todas las soluciones sufren de ese problema),
navigator.onLine
es definitivamente el mejor ahora que es multi-navegador.– Stijn de Witt
26 de junio de 2015 a las 0:14
-
"One option is to set up a server-side proxy, wherein we actually ping google (or whatever site), and return the results of the ping to the app"
. Debería no se indica como una posible solución examinar. Incluso si tuviera una conexión a mi servidor, quiero verificar si puedo acceder a Google, no a mi servidor.– Marinos An
29 de septiembre de 2020 a las 14:32
otorgar wagner
IE 8 admitirá el ventana.navigator.onLine propiedad.
Pero, por supuesto, eso no ayuda con otros navegadores o sistemas operativos. Predigo que otros proveedores de navegadores también decidirán proporcionar esa propiedad 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 un Image()
o <img>
request puede proporcionar algo cercano a la funcionalidad que desea.
Actualización (2014/11/16)
Los principales navegadores ahora admiten esta propiedad, pero los 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 regresan
true
. Entonces, si bien puede suponer que el navegador está fuera de línea cuando devuelve unfalse
valor, no puede asumir que un valor verdadero significa necesariamente que el navegador puede acceder a Internet. Es posible que obtenga falsos positivos, como en los casos en que la computadora ejecuta 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 fuera de línea envía un
false
valor. Todas las demás condiciones devuelven untrue
valor.
-
navigator.onLine es parte de HTML5; otros navegadores ya tienen versiones de desarrollo que lo proporcionan; ya está disponible en Firefox 3 hoy.
– olliej
9 oct 2008 a las 23:25
-
-pero lamentablemente no está disponible en versiones anteriores de IE, que a menudo debemos admitir.
– keparo
10 de octubre de 2008 a las 18:09
-
navigator.onLine muestra el estado del navegador y no la conexión real. Por lo tanto, puede configurar su navegador para que esté en línea, pero en realidad fallaría porque la conexión no funciona. navigator.onLine solo será falso si el navegador está configurado para navegar sin conexión.
– usuario327117
27 de abril de 2010 a las 17:52
-
si apago el WI-FI en mi Nexus7, la página todavía dice que navigator.onLine es VERDADERO. Malo…
– Walv
12 de septiembre de 2014 a las 7:28
Edmhs
if (navigator.onLine) {
alert('online');
} else {
alert('offline');
}
ConroyP
Hay muchas maneras de hacer esto:
- Solicitud AJAX a su propio sitio web. Si esa solicitud falla, es muy probable que la conexión sea la culpable. El JQuery La documentación tiene una sección sobre manejo de solicitudes AJAX fallidas. Cuidado con el Política del mismo origen al hacer esto, lo que puede impedirle acceder a sitios fuera de su dominio.
- Podrías poner un
onerror
en unimg
como<img src="http://www.example.com/singlepixel.gif" onerror="alert('Connection dead');" />
.
Este método también podría fallar si la imagen de origen se mueve o cambia de nombre y, en general, 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 salir del entorno limitado del navegador y acceder directamente al estado de conexión de la red del usuario, parecen ser las mejores opciones.
Sofía
Como dijo olliej, usando el navigator.onLine
la propiedad del navegador es preferible a enviar solicitudes de red y, de acuerdo con developer.mozilla.org/En/Online_and_offline_eventsincluso es compatible con versiones antiguas de Firefox e IE.
Recientemente, el WHATWG ha especificado la adición de la online
y offline
eventos, en caso de que necesite reaccionar navigator.onLine
cambios.
También preste atención al enlace publicado por Daniel Silveira que señala que confiar en esa señal/propiedad para sincronizar con el servidor no siempre es una buena idea.
fuego de seda
Puedes usar $.ajax()‘s error
devolución de llamada, que se activa si la solicitud falla. Si textStatus
es igual a la cadena “tiempo de espera”, 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
}
Desde el doc:
Error: una función que se llamará si la solicitud falla. A la función se le pasan tres argumentos: el objeto XMLHttpRequest, una cadena que describe el tipo de error que ocurrió y un objeto de excepción opcional, si ocurrió alguno. Los valores posibles para el segundo argumento (además de nulo) son “timeout”, “error”, “notmodified” y “parsererror”. Este es un evento de Ajax
Así 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!');
}
}
});
Si puede o ya usa websockets, los websockets tienen un evento de cierre que debe llamarse si el usuario pierde la conexión con el servidor.
– Simón
31 de enero de 2019 a las 15:12
Esto me recuerda a los años 90 cuando todo lo que tenías que hacer era declarar eventos de imagen con image = new Image();image.onload=onloadfunction;image.onerror=onerrorfunction;luego configuraba image.src=”image.gif?”+ Matemáticas.aleatoria(); Creo que todavía funciona hoy.
– PHP Gurú
23 de septiembre de 2020 a las 17:05