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í!!
Entries (RSS)
Outubro 29th, 2009 at 4:54 PM
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 =)