Estou tentando detectar com precisão quando o navegador fica offline, usando os eventos HTML5 online e offline.
Este é o meu 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 bem quando clico em "Trabalhar offline" no Firefox ou no IE, mas funciona de forma aleatória quando eu realmente desconecto o fio.
Qual é a melhor maneira de detectar essa mudança? Eu gostaria de evitar a repetição de chamadas ajax com tempo limite.
javascript
jquery
offline
jquery-events
network-connection
Pierre Duplouy
fonte
fonte
Respostas:
Os fornecedores de navegadores não concordam sobre como definir offline. Alguns navegadores têm um recurso Trabalhar Offline, que eles consideram separado da falta de acesso à rede, que novamente é diferente do acesso à Internet. A coisa toda está uma bagunça. Alguns fornecedores de navegadores atualizam o sinalizador navigator.onLine quando o acesso à rede real é perdido, outros não.
Da especificação:
Finalmente, as notas de especificações:
fonte
Os principais fornecedores de navegadores diferem sobre o que "offline" significa.
O Chrome e o Safari detectarão quando você ficar "offline" automaticamente - o que significa que os eventos e propriedades "online" serão disparados automaticamente quando você desconectar o cabo de rede.
Firefox (Mozilla), Opera e IE adotam uma abordagem diferente e consideram você "online", a menos que você escolha explicitamente "Modo offline" no navegador - mesmo que não tenha uma conexão de rede funcionando.
Existem argumentos válidos para o comportamento do Firefox / Mozilla, que são descritos nos comentários deste relatório de bug:
https://bugzilla.mozilla.org/show_bug.cgi?id=654579
Mas, para responder à pergunta - você não pode confiar nos eventos / propriedades online / offline para detectar se realmente há conectividade de rede.
Em vez disso, você deve usar abordagens alternativas.
A seção "Notas" deste artigo do Mozilla Developer fornece links para dois métodos alternativos:
https://developer.mozilla.org/en/Online_and_offline_events
"Se a API não estiver implementada no navegador, você pode usar outros sinais para detectar se está off-line, incluindo a escuta de eventos de erro AppCache e respostas de XMLHttpRequest"
Este link para um exemplo da abordagem de "escuta de eventos de erro do AppCache":
http://www.html5rocks.com/en/mobile/workingoffthegrid/#toc-appcache
... e um exemplo da abordagem de "escuta de falhas XMLHttpRequest":
http://www.html5rocks.com/en/mobile/workingoffthegrid/#toc-xml-http-request
HTH, - Chad
fonte
updates this property when the OS reports a change in network connectivity on Windows, Linux, and OS X.
(de acordo com os documentos que você mencionou). Portanto, não é apenas offline se você estiver navegando com o navegador "Modo offline"Hoje existe uma biblioteca JavaScript de código aberto que faz este trabalho: é chamada
Offline.js
.https://github.com/HubSpot/offline
Certifique-se de verificar o README completo . Ele contém eventos aos quais você pode se conectar.
Aqui está uma página de teste . É lindo / tem um bom feedback da IU por falar nisso! :)
fonte
A melhor maneira que funciona agora em todos os navegadores principais é o seguinte script:
Fonte: http://robertnyman.com/html5/offline/online-offline-events.html
fonte
Recentemente,
navigator.onLine
mostra o mesmo em todos os principais navegadores e, portanto, pode ser usado.As versões mais antigas que suportam isso da maneira certa são: Firefox 41 , IE 9, Chrome 14 e Safari 5.
Atualmente, isso representará quase todo o espectro de usuários, mas você deve sempre verificar o que os usuários de sua página têm de recursos.
Anterior ao FF 41, ele só seria mostrado
false
se o usuário colocasse o navegador manualmente no modo offline. No IE 8, a propriedade estava nobody
, em vez dewindow
.fonte: caniuse
fonte
O
window.navigator.onLine
atributo e seus eventos associados Atualmente não confiável em determinados navegadores da web ( especialmente de desktop Firefox ) como @Junto disse, então eu escrevi um pouco de função (usando jQuery) que verificar periodicamente o estado de conectividade de rede e aumentar a apropriadaoffline
eonline
evento:Você pode usá-lo assim:
Para ouvir os eventos offline e online (com a ajuda de jQuery):
fonte
navigator.onLine é uma bagunça
Encaro isso ao tentar fazer uma chamada ajax para o servidor.
Existem várias situações possíveis quando o cliente está offline:
A solução que estou usando é controlar o status sozinho com javascript. Defino a condição de chamada bem-sucedida, em qualquer outro caso presumo que o cliente está offline. Algo assim:
fonte
Em HTML5 você pode usar a
navigator.onLine
propriedade. Olhe aqui:http://www.w3.org/TR/offline-webapps/#related
Provavelmente, seu comportamento atual é aleatório, pois o javascript só prepara a variável "navegador" e sabe se você está offline e online, mas não verifica a conexão de rede.
Informe-nos se é isso que você está procurando.
Atenciosamente,
fonte
Encontre o módulo require.js que escrevi para offline.
Por favor, leia esta postagem do blog e deixe-me saber sua opinião. http://zen-and-art-of-programming.blogspot.com/2014/04/html-5-offline-application-development.html Ele contém um exemplo de código usando offline.js para detectar quando o cliente está offline.
fonte
você pode detectar o modo cross-browser offline facilmente como abaixo
você pode substituir yoururl.com por
document.location.pathname
.O ponto crucial da solução é tentar se conectar ao seu nome de domínio, se você não conseguir se conectar - você está offline. funciona em qualquer navegador.
fonte
Eu uso a opção FALLBACK no manifesto do cache HTML5 para verificar se meu aplicativo html5 está online ou offline por:
Na página html eu uso javascript para ler o conteúdo do arquivo txt online / offline:
Quando estiver offline, o script lerá o conteúdo do offline.txt. Com base no texto dos arquivos, você pode detectar se a página da web está online ou offline.
fonte
Aqui está minha solução.
Testado com IE, Opera, Chrome, FireFox, Safari, como Phonegap WebApp no IOS 8 e como Phonegap WebApp no Android 4.4.2
Esta solução não está funcionando com o FireFox no localhost.
========================================================== =================================
onlineCheck.js (caminho de arquivo: "root / js / onlineCheck.js):
========================================================== =================================
index.html (caminho de arquivo: "root / index.html"):
========================================================== =================================
checkOnline.php (filepath: "root"):
fonte
bem, você pode tentar o plugin javascript que pode monitorar a conexão do navegador em tempo real e notificar o usuário se a internet ou a conexão do navegador com a internet caiu.
Plug-in Javascript Wiremonkey e a demonstração que você pode encontrar aqui
fonte
Usando o corpo do documento:
Usando o evento Javascript:
Referência :
Document-Body: ononline Event
Javascript-Event: Eventos online e offline
Pensamentos adicionais:
Para distribuir a "conexão de rede não é o mesmo que conexão de internet" Problema com os métodos acima: Você pode verificar a conexão de internet uma vez com ajax no início do aplicativo e configurar um modo online / offline. Crie um botão de reconexão para o usuário ficar online. E adicione em cada solicitação ajax com falha uma função que leve o usuário de volta ao modo offline.
fonte
window.addEventListener('online', updateOnlineStatus(event) );
porque você está chamando a função updateOnlineStatus () imediatamente. Deveria serwindow.addEventListener('online', updateOnlineStatus );