Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Prove Yourself

[Resolvido] readyState sempre retorna 1

Recommended Posts

Utilizo o seguinte código AJAX:

function populaComboCidades() {

	//CASO O STATUS DO AJAX SEJA OK, CHAMA A FUNÇÃO mudar()

	//A LISTA COMPLETA DOS VALORES readyState É A SEGUINTE:

	//0 (uninitialized) 

	//1 (a carregar) 

	//2 (carregado) 

	//3 (interactivo) 

	//4 (completo) 

    if (retorno.readyState == 4) {

		if(retorno.status == 200) {

			//PROCURA PELA DIV MOSTRACOMBO E INSERE O OBJETO

			var cidades = retorno.responseText.split(';');

			var tamanho = cidades.length - 1;



			removerOptions();



			for(var i = 0; i < tamanho; i+= 2) {

				var option = document.createElement('option');

				option.value = cidades[i];

				option.text = cidades[i + 1];


				document.getElementById('cidades').appendChild(option);

			}

		}

		else {

			//MOSTRA UM ALERTA AO OBTER UM RETORNO DE OK.

			alert("Houve um problema ao obter os dados:\n" + retorno.statusText);

		}

   }

}

function CarregaArquivo(url, valor, funcao) {

    retorno = null;

	//CRIA O OBJETO HttpRequest PARA O RESPECTIVO NAVEGADOR

	//Mozilla Fire Fox / Safari ...

	//

    if (window.XMLHttpRequest) {

        retorno = new XMLHttpRequest();
        if(retorno) {

			//SETA A FUNÇÃO QUE SERÁ CHAMADA QUANDO O AJAX DER UM RETORNO

		    retorno.onreadystatechange = funcao;

			 //ABRE A REQUISIÇÃO AJAX, PASSANDO O MÉTODO DE ACESSO, URL E O PARÂMETRO

		    retorno.open("GET", url + valor, true);
		    retorno.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");

			//INICIA O TRANSPORTA DOS OBJETOS NA REQUISIÇÃO

		    retorno.send(null);
        }

    } else if (window.ActiveXObject) {

		//

		//IE

		//

        retorno = new ActiveXObject("Microsoft.XMLHTTP");

        if (retorno) {

			//SETA A FUNÇÃO QUE SERÁ CHAMADA QUANDO O AJAX DER  UM RETORNO

            retorno.onreadystatechange = funcao;

		    //ABRE A REQUISIÇÃO AJAX, PASSANDO O MÉTODO DE ACESSO, URL E O PARÂMETRO

            retorno.open("GET", url + valor, true);

			//INICIA O TRANSPORTA DOS OBJETOS NA REQUISIÇÃO

            retorno.send();

        }

    }

}
E chamo estas funções assim:

<select id="estados" name="estados" tabindex="13" onchange="CarregaArquivo('mostra_combo.php?grupo=', this.value, populaComboCidades);">
O problema é que retorno.readyState é sempre igual a 1. Como posso resolver este problema?

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Na verdade, você está tentando usar como objeto ajax a variável retorno

 

e o escopo dela não é global, existindo apenas na função em que você criou ela.

Por isso que na segunda função, cai sempre dentro do ELSE, pois retorno tem valor false(undefined) na segunda function.

 

Então 'das duas uma', ou você cria essa variável que vai conter o objeto XMLHttpRequest, em escopo global(ideal), ou manda como parâmetro para a segunda function, saber que ele existe.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas aqui:

function CarregaArquivo(url, valor, funcao) {
    retorno = null;
    if (window.XMLHttpRequest) {

        retorno = new XMLHttpRequest();
        if(retorno) {
você recria ela.

Por isso o teu problema.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Okay, e como ficou o código agora ?

tem como isolar o problema, e postar um mínimo de códigos necessários, para que testemos ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

var retorno = null;

 

function populaComboCidades() {

if (retorno.readyState == 4) {

if(retorno.status == 200) {

var cidades = retorno.responseText.split(';');

var tamanho = cidades.length - 1;

 

removerOptions();

 

for(var i = 0; i < tamanho; i+= 2) {

var option = document.createElement('option');

option.value = cidades;

option.text = cidades[i + 1];

document.getElementById('cidades').appendChild(option);

}

}

else {

alert("Houve um problema ao obter os dados:\n" + retorno.statusText);

}

}

}

 

function CarregaArquivo(url, valor, funcao) {

 

if (window.XMLHttpRequest) {

retorno = new XMLHttpRequest();

if(retorno) {

retorno.onreadystatechange = funcao;

 

retorno.open("GET", url + valor, true);

retorno.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");

retorno.send(null);

}

} else if (window.ActiveXObject) {

retorno = new ActiveXObject("Microsoft.XMLHTTP");

 

if (retorno) {

retorno.onreadystatechange = funcao;

 

retorno.open("GET", url + valor, true);

retorno.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");

retorno.send();

}

}

}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Uê, mas continua igual !

não era pra trocar pelo que postei, mas entender oque eu tava falando...

 

vamos lá então:

function CarregaArquivo(url, valor, funcao) {

    if (window.XMLHttpRequest) {
        retorno = new XMLHttpRequest();
        if(retorno) {
                    retorno.onreadystatechange = funcao;
                    
                    retorno.open("GET", url + valor, true);
                    retorno.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");
                    retorno.send(null);
        }
    } else if (window.ActiveXObject) {
        retorno = new ActiveXObject("Microsoft.XMLHTTP");

        if (retorno) {
            retorno.onreadystatechange = funcao;

            retorno.open("GET", url + valor, true);
            retorno.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");
            retorno.send();
        }
    }
}
troca por:

function getHTTPObject(){
        if(window.XMLHttpRequest){
                return new XMLHttpRequest();
        }else if(window.ActiveXObject) {
                var prefixes = ["MSXML2", "Microsoft", "MSXML", "MSXML3"]
                for(var i = 0; i < prefixes.length; i++){
                        try     {
                                return new ActiveXObject(prefixes[i] + ".XMLHTTP");
                        } catch (e) {}
                }
        }
}
var retorno = getHTTPObject();
function CarregaArquivo(url, valor, funcao) 
{
                    retorno.onreadystatechange = funcao;
                    
                    retorno.open("GET", url + valor, true);
                    retorno.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");
                    retorno.send(null);
}
Ai sim, você terá a variável retorno como global, e sem nenhuma função reescrevendo o valor dela.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.