¿Cómo detectar eventos en línea/fuera de línea en varios navegadores?
Estoy tratando de detectar con precisión cuándo el navegador se desconecta, utilizando los eventos HTML5 en línea y fuera de línea.
Aquí está mi código:
<script>
// FIREFOX
$(window).bind("online", applicationBackOnline);
$(window).bind("offline", applicationOffline);
//IE
window.onload = function() {
document.body.ononline = IeConnectionEvent;
document.body.onoffline = IeConnectionEvent;
}
</script>
Funciona bien cuando presiono "Trabajar sin conexión" en Firefox o IE, pero funciona de forma aleatoria cuando desconecto el cable.
¿Cuál es la mejor manera de detectar este cambio? Me gustaría evitar repetir llamadas ajax con tiempos de espera.
Actualmente, en 2011, los distintos proveedores de navegadores no pueden ponerse de acuerdo sobre cómo definirlo sin conexión. Algunos navegadores tienen una función Trabajar sin conexión, que consideran independiente de la falta de acceso a la red, que nuevamente es diferente al acceso a Internet. Todo esto es un desastre. Algunos proveedores de navegadores actualizan el indicador navigator.onLine cuando se pierde el acceso real a la red, otros no.
De la especificación:
Devuelve falso si el agente de usuario está definitivamente fuera de línea (desconectado de la red). Devuelve verdadero si el agente de usuario puede estar en línea.
Los eventos en línea y fuera de línea se activan cuando cambia el valor de este atributo.
El atributo navigator.onLine debe devolver falso si el agente de usuario no se pone en contacto con la red cuando el usuario sigue enlaces o cuando un script solicita una página remota (o sabe que dicho intento fallaría), y debe devolver verdadero en caso contrario.
Finalmente, las notas de especificación:
Este atributo es inherentemente poco confiable. Una computadora se puede conectar a una red sin tener acceso a Internet.
Los principales proveedores de navegadores difieren sobre lo que significa "sin conexión".
Chrome, Safari y Firefox (desde la versión 41) detectarán automáticamente cuando usted esté "sin conexión", lo que significa que los eventos y propiedades "en línea" se activarán automáticamente cuando desconecte el cable de red.
Mozilla Firefox (antes de la versión 41), Opera e IE adoptan un enfoque diferente y lo consideran "en línea" a menos que seleccione explícitamente "Modo sin conexión" en el navegador, incluso si no tiene una conexión de red que funcione.
Existen argumentos válidos para el comportamiento de Firefox/Mozilla, que se describen en los comentarios de este informe de error:
https://bugzilla.mozilla.org/show_bug.cgi?id=654579
Pero, para responder a la pregunta, no puede confiar en los eventos/propiedades en línea/fuera de línea para detectar si realmente hay conectividad de red.
En su lugar, debe utilizar enfoques alternativos.
La sección "Notas" de este artículo para desarrolladores de Mozilla proporciona enlaces a dos métodos alternativos:
https://developer.mozilla.org/en/Online_and_offline_events
"Si la API no está implementada en el navegador, puede usar otras señales para detectar si está desconectado, incluida la escucha de eventos de error de AppCache y respuestas de XMLHttpRequest"
Esto enlaza con un ejemplo del enfoque "escuchar eventos de error de AppCache":
http://www.html5rocks.com/en/mobile/workingoffthegrid/#toc-appcache
...y un ejemplo del enfoque de "escuchar errores de XMLHttpRequest":
http://www.html5rocks.com/en/mobile/workingoffthegrid/#toc-xml-http-request
HTH, -- Chad