Hoje vou falar um pouco da propriedade readyState e do manipulador de eventos onReadyStateChange.

Ambos são muito comuns nas aplicações AJAX, mas poucas pessoas o conhecem a fundo.

Antes de começar, gostaria de deixar uma observação: eles não estão disponíveis apenas para o elemento OBJECT, mas para todos os elementos HTML (apartir da verão 5 do Internet Explorer), ainda que para a maioria deles a propriedade readyState retorne sempre 4 (completamente carregado). A maior parte dos outros estados (veja tabela no fim do artigo) é usada apenas por elementos como IMG, EMBED e OBJECT.

Agora vejamos o seguinte exemplo de uma aplicação AJAX:

// cria um objeto ajax
function createAjaxObj()
{
    try {
        return new XMLHttpRequest();
    } catch(ee){
        try {
            return new ActiveXObject("Msxml2.XMLHTTP");
        } catch(e){
            try {
                return new ActiveXObject("Microsoft.XMLHTTP");
            } catch(E){
                return false;
            }
        }
    }
}

// funcao ajax de exemplo
function doSomething()
{
    // cria o objeto ajax
    var xmlhttp = createAjaxObj();

    // Abre a url
    xmlhttp.open("GET", "./somePage.php");

    // Executada quando o navegador obtiver o código
    xmlhttp.onreadystatechange = function() {

        if (xmlhttp.readyState == 4){

            // retorno do arquivo PHP
            var rtn = xmlhttp.responseText;

            // mostra o conteudo retornado pelo arquivo PHP
            alert(rtn);
        }
    }
    xmlhttp.send(null);
}

Neste exemplo simplesmente acessamos uma pagina ( somePage.php ) que devolve algum dado qualquer. Mas vamos ao que interessa! :-)

Quando enviamos a chamada ao servidor ( xmlhttp.send(null) ) a propriedade readyState tem valor 0. Quando os dados começam a ser carregados, a propriedade readyState passa a valer 1 e o manipulador de eventos onReadyStateChange é invocado. Ao final do processo, caso os dados tenham sido carregados com sucesso, readyState passa a valer 4, e onReadyStateChange é novamente invocado. Desta vez entramos no condicional if(xmlhttp.readyState == 4) e executamos a instrução programada.

A idéia básica é: toda vez que readyState muda de valor, o manipulador de eventos onReadyStateChange é chamado e executado as instruções dentro dele definidas.

Os possíveis valores para readyState são:

Valor Significado
0 Objeto ainda não começou a carregar dados
1 Dados sendo carregados
2 Dados são carregados, mas o objeto pode estar sendo iniciado
3 Dados não podem ser carregados totalmente, mas o usuário pode interagir com o elemento
4 Elemento e dados totalmente carregados

Gostou? Tem Dúvidas? Comenta aí!!

Um comentário para “ReadyState e onReadyStateChange”

  1. Anderson says:

    Olá amigo. Há muito tempo essa dica está aqui, então vou torcer pra que você veja minha pergunta e possa me ajudar.

    Seguinte, tenho uma página que carrega um grid dinamicamente através do ajax. Preciso que no final do carregamento da página, eu faça um
    document.write(grid.getRowsNum());

    certo. O problema que só posso fazer isso após o preenchimento por completo de todo o grid, senão ele me retorna 0(Zero)

    Acontece que na chamada da função do meu script de carregamento do grid, eu faço

    onreadystatechange = miinhaFuncao(XmlHTTPrequest);

    só que em minha função, o readyState chega como 1, e ele nunca muda pra 4, mesmo quando o grid já está carregado.
    O Interessante, é que se eu emito um alert(); logo na entrada da função, o readyState já muda pra 4. Sabe porque ocorre isso?
    Como solucionar o meu problema?

    Obrigado e parabéns pelo post =)

Responder