Como detectar se a conexão com a Internet está offline em JavaScript?
javascript
ajax
offline
connectivity
internet-connection
Daniel Silveira
fonte
fonte
Respostas:
Você pode determinar que a conexão é perdida fazendo solicitações XHR com falha .
A abordagem padrão é repetir a solicitação algumas vezes. Se não for aprovado, alerte o usuário para verificar a conexão e falhe normalmente .
Nota: Para colocar o aplicativo inteiro em um estado "offline", você pode levar a muito trabalho sujeito a erros no tratamento do estado. As conexões sem fio podem ir e vir, etc. Portanto, sua melhor aposta é falhar normalmente, preservar o dados e alertar o usuário. permitindo que, eventualmente, corrija o problema de conexão, se houver, e continue usando o aplicativo com uma boa quantia de perdão.
Nota: Você pode verificar um site confiável como o google para obter conectividade, mas isso pode não ser totalmente útil, apenas tentando fazer sua própria solicitação, porque, embora o Google esteja disponível, seu próprio aplicativo pode não estar, e você ainda vai precisa lidar com seu próprio problema de conexão. Tentar enviar um ping para o google seria uma boa maneira de confirmar que a conexão com a Internet está inoperante; portanto, se essas informações forem úteis para você, vale a pena.
Nota : O envio de um ping pode ser alcançado da mesma maneira que você faria qualquer tipo de solicitação de ajax bidirecional, mas enviar um ping para o google, nesse caso, apresentaria alguns desafios. Primeiro, teríamos os mesmos problemas entre domínios que normalmente são encontrados na comunicação do Ajax. Uma opção é configurar um proxy do lado do servidor, no qual, na verdade, pesquisamos no
ping
Google (ou em qualquer site) e devolvemos os resultados do ping ao aplicativo. Este é um prendedor-22porque se a conexão à Internet for realmente o problema, não conseguiremos acessar o servidor e, se o problema de conexão estiver apenas em nosso próprio domínio, não poderemos dizer a diferença. Outras técnicas entre domínios podem ser tentadas, por exemplo, incorporando um iframe em sua página que aponte para google.com e, em seguida, pesquisando o iframe para obter sucesso / falha (examine o conteúdo etc.). A incorporação de uma imagem pode não nos dizer nada, porque precisamos de uma resposta útil do mecanismo de comunicação para tirar uma boa conclusão sobre o que está acontecendo. Novamente, determinar o estado da conexão à Internet como um todo pode ser mais complicado do que vale a pena. Você terá que ponderar essas opções para seu aplicativo específico.fonte
O IE 8 suportará a propriedade window.navigator.onLine .
Mas é claro que isso não ajuda em outros navegadores ou sistemas operacionais. Prevejo que outros fornecedores de navegadores decidirão fornecer essa propriedade também, dada a importância de conhecer o status online / offline nos aplicativos Ajax.
Até que isso aconteça, o XHR ou um
Image()
ou<img>
request podem fornecer algo próximo à funcionalidade desejada.Atualização (16/11/2014)
Os principais navegadores agora oferecem suporte a essa propriedade, mas seus resultados variam.
Citação da documentação do Mozilla :
fonte
Quase todos os principais navegadores agora suportam a
window.navigator.onLine
propriedade e os eventos correspondentesonline
eoffline
window:Tente configurar o sistema ou o navegador no modo offline / online e verifique o console ou a
window.navigator.onLine
propriedade quanto a alterações de valor. Você também pode testá-lo neste site .Observe, no entanto, esta citação da documentação do Mozilla :
(a ênfase é minha)
Isso significa que, se
window.navigator.onLine
forfalse
(ou você receber umoffline
evento), é garantido que você não tem conexão com a Internet.true
No entanto, se for (ou você receber umonline
evento), isso significa apenas que o sistema está conectado a alguma rede. Isso não significa que você tenha acesso à Internet, por exemplo. Para verificar isso, você ainda precisará usar uma das soluções descritas nas outras respostas.Inicialmente, pretendia postar isso como uma atualização da resposta de Grant Wagner , mas parecia uma edição muito grande, especialmente considerando que a atualização de 2014 já não era dele .
fonte
Existem várias maneiras de fazer isso:
Você pode colocar
onerror
umimg
, comoEsse método também pode falhar se a imagem de origem for movida / renomeada e geralmente seria uma opção inferior à opção ajax.
Portanto, existem várias maneiras diferentes de tentar detectar isso, nenhuma perfeita, mas, na ausência da capacidade de sair da caixa de proteção do navegador e acessar diretamente o status da conexão de rede do usuário, elas parecem ser as melhores opções.
fonte
fonte
A API do cache de aplicativos HTML5 especifica navigator.onLine, que está disponível atualmente no IE8 betas, no WebKit (por exemplo, Safari), e já é suportado no Firefox 3
fonte
Você pode usar o retorno de chamada de $ .ajax ()
error
, que é acionado se a solicitação falhar. Se fortextStatus
igual à string "timeout", provavelmente significa que a conexão está interrompida:Do documento :
Então, por exemplo:
fonte
Como olliej disse,
navigator.onLine
é preferível usar a propriedade do navegador do que enviar solicitações de rede e, de acordo com developer.mozilla.org/En/Online_and_offline_events , ele é compatível com versões antigas do Firefox e IE.Recentemente, o WHATWG especificou a adição dos eventos
online
eoffline
, caso você precise reagir àsnavigator.onLine
alterações.Por favor, preste atenção também no link postado por Daniel Silveira, que aponta que confiar nesses sinais / propriedades para sincronizar com o servidor nem sempre é uma boa ideia.
fonte
é o que você procura, mas há poucas coisas a serem adicionadas aqui, primeiro, se é algo no seu aplicativo que você deseja verificar (gostaria de ver se o usuário fica subitamente offline, o que é correto nesse caso na maioria das vezes, então você também é necessário escutar a alteração). Para isso, você adiciona um ouvinte de evento à janela para detectar qualquer alteração. Para verificar se o usuário fica offline, você pode:
e para verificar se online:
fonte
onLine
. Os navegadores definem o estado de estar online de maneira muito diferente. Dê uma olhada em developer.mozilla.org/en-US/docs/Web/API/NavigatorOnLine/onLine .Eu tive que fazer um aplicativo da Web (baseado em Ajax) para um cliente que trabalha muito com escolas, essas escolas geralmente têm uma conexão ruim à Internet. Eu uso essa função simples para detectar se há uma conexão, funciona muito bem!
Eu uso CodeIgniter e Jquery:
fonte
uma chamada ajax para o seu domínio é a maneira mais fácil de detectar se você está offline
isto é apenas para lhe dar o conceito, ele deve ser aprimorado.
Por exemplo, erro = 404 ainda deve significar que você está online
fonte
Eu acho que é uma maneira muito simples.
fonte
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
Eu estava procurando uma solução do lado do cliente para detectar se a Internet estava inoperante ou se meu servidor estava inoperante. As outras soluções que encontrei sempre pareciam depender de um arquivo ou imagem de script de terceiros, que para mim não pareciam resistir ao teste do tempo. Um script ou imagem hospedada externa pode mudar no futuro e causar falha no código de detecção.
Eu encontrei uma maneira de detectá-lo procurando um xhrStatus com um código 404. Além disso, eu uso o JSONP para ignorar a restrição do CORS. Um código de status diferente de 404 mostra que a conexão à Internet não está funcionando.
fonte
O meu caminho.
fonte
O problema de alguns métodos
navigator.onLine
é que eles não são compatíveis com alguns navegadores e versões móveis, uma opção que me ajudou muito foi usar oXMLHttpRequest
método clássico e também prever o possível caso de o arquivo ser armazenado em cache com respostaXMLHttpRequest.status
maior que 200 e menos que 304.Aqui está o meu código:
fonte
Existem 2 respostas para dois senarios diferentes: -
Se você estiver usando JavaScript em um site (por exemplo, ou qualquer parte do front-end), a maneira mais simples de fazer isso é:
Mas se você estiver usando js no lado do servidor (ou seja, nó etc.), poderá determinar que a conexão será perdida fazendo solicitações XHR com falha.
A abordagem padrão é tentar novamente a solicitação algumas vezes. Se não for aprovado, alerte o usuário para verificar a conexão e falhe normalmente.
fonte
cabeça de solicitação no erro de solicitação
fonte
Aqui está um trecho de um utilitário auxiliar que eu tenho. Este é o javascript no namespace:
Você deve usá-lo com a detecção de método, para disparar uma maneira 'alternativa' de fazer isso. Está chegando o tempo em que tudo será necessário. Os outros métodos são hacks.
fonte