Pergunta

Tenho uma aplicação web, onde há um número de componentes Ajax que se cada atualizar com tanta frequência dentro de uma página (é um painel de tipos).

Agora, eu quero adicionar funcionalidade para a página de modo que quando não há conectividade com a Internet, o conteúdo atual da página não muda e uma será exibida mensagem na página dizendo que a página está offline (atualmente, como estes vários dispositivos na página tentar refrescar-se e descobrir que não há conectividade, seus dados de idade desaparece).

Então, qual é a melhor maneira de fazer isso?

Foi útil?

Solução

Uma maneira de lidar com isso poderia ser a de estender o objeto XMLHttpRequest com um método de tempo limite explícito, em seguida, usar isso para determinar se você está trabalhando no modo off-line (isto é, para navegadores que não suportam navigator.onLine). Aqui está como eu implementado timeouts Ajax em um site (um site que usa o href='http://prototypejs.org/"Prototype"' rel="nofollow noreferrer"> Prototype biblioteca ). Após 10 segundos (10.000 milissegundos), ele interrompe a chamada e chama o método onFailure.

/**
 * Monitor AJAX requests for timeouts
 * Based on the script here: http://codejanitor.com/wp/2006/03/23/ajax-timeouts-with-prototype/
 *
 * Usage: If an AJAX call takes more than the designated amount of time to return, we call the onFailure
 *        method (if it exists), passing an error code to the function.
 *
 */

var xhr = {
    errorCode: 'timeout',
    callInProgress: function (xmlhttp) {
        switch (xmlhttp.readyState) {
            case 1: case 2: case 3:
                return true;
            // Case 4 and 0
            default:
                return false;
        }
    }
};

// Register global responders that will occur on all AJAX requests
Ajax.Responders.register({
    onCreate: function (request) {
        request.timeoutId = window.setTimeout(function () {
            // If we have hit the timeout and the AJAX request is active, abort it and let the user know
            if (xhr.callInProgress(request.transport)) {
                var parameters = request.options.parameters;
                request.transport.abort();
                // Run the onFailure method if we set one up when creating the AJAX object
                if (request.options.onFailure) {
                    request.options.onFailure(request.transport, xhr.errorCode, parameters);
                }
            }
        },
        // 10 seconds
        10000);
    },
    onComplete: function (request) {
        // Clear the timeout, the request completed ok
        window.clearTimeout(request.timeoutId);
    }
});

Outras dicas

navigator.onLine

Isso deve fazer o que você está pedindo.

Você provavelmente vai querer verificar que, em qualquer código que você tem que atualiza a página. Por exemplo:

if (navigator.onLine) {
    updatePage();
} else {
    displayOfflineWarning();
}

Parece que você já respondeu a sua própria pergunta. Se os gadgets enviar um pedido de asynch e TI vezes fora, não atualizá-los. Se um número suficiente deles para fazer assim, exibir a página "está offline" mensagem.

o HTML 5 projecto de especificação. Você quer navigator.onLine. Nem todos os navegadores suportam ainda. Firefox 3 e Opera 9.5 fazer.

Parece como se você está tentando encobrir o problema em vez de resolvê-lo. Se um pedido não faz com que seus widgets para limpar seus dados, então você deve corrigir o seu código para que ele não tenta atualizar seus widgets a menos que receba uma resposta, em vez de tentar descobrir se o pedido será bem-sucedida antes do tempo.

Hmm, na verdade, agora eu olhar para ele um pouco, é um pouco mais complicado do que isso. Ter uma leitura desses links blog de John Resig e Mozilla local . O cartaz acima pode também ter um ponto bom -. Você está fazendo solicitações de qualquer maneira, então você deve ser capaz de trabalhar para fora quando eles falham .. Isso pode ser uma maneira muito mais confiável para ir

Fazer uma chamada para um destino de confiança, ou talvez uma série de chamadas, os que devem passar e retornar se o usuário tiver uma conexão de rede ativa - mesmo algo tão simples como um ping token para o Google, Yahoo e MSN, ou algo assim. Se pelo menos uma volta verde, você sabe que está conectado.

Eu acho que o Google Gears tem tal funcionalidade, talvez você poderia verificar como eles fizeram isso.

Use o HTML5 API relevante: online / offline estado / eventos .

Uma solução possível é que, se a página e a página em cache têm uma url diferente para apenas olhar e ver o que url que você está. Se você está no URL da página em cache, então você está no modo offline. Este blog faz um bom ponto sobre o porquê navigator.online está quebrado

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top