Ir para conteúdo

POWERED BY:

Arquivado

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

RobertoPC

[Resolvido] Passando responseText para variável

Recommended Posts

Fala aew galera,

 

É o seguinte, estou tentando passar o responseText do ajax para uma variável mas não estou conseguindo. Tentei o seguinte:

 

Javascript

var variavelGlobal = "...";

function pegaValor(){

   var ajax = new XMLHttpRequest();

   ajax.onreadystatechange = function(){

      if(ajax.readyState == 4){

         variavelGlobal = ajax.responseText;

         // Alerta 1: Imprime 'Olá mundo!'
         alert(variavelGlobal);

      }

   }

   ajax.open("GET","mandavalor.php",true);

   ajax.send(null);

   // Alerta 2: Imprime '...'
   alert(variavelGlobal);

}

mandavalor.php

<?php

   echo"Olá mundo!";

?>

No caso eu quero que o alerta 2 imprima 'Olá mundo!'. Tem alguma maneira de fazer isso?

 

P.s.: Estou utilizando o script em um arquivo '.js'.

 

http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

 

Vlw

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estou com o mesmo problema.

 

Se encontrar a solução, não esqueça de mostra-la.

 

Edit:

 

Consegui!

 

   ajax( "IndicesView?OpenAgent&view=" + view + "&page=" + page,"indice");

 

function ajax(link,divID){   
     var div = document.getElementById(divID); 
	var xmlhttp;
	if (window.XMLHttpRequest)
  	{
		  xmlhttp=new XMLHttpRequest();
	  }
	else
  	{
  		xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
	  }
	xmlhttp.open("GET",link,true);
	
	xmlhttp.onreadystatechange=function() {

                if (xmlhttp.readyState==4){
                        var texto=xmlhttp.responseText
                       div.innerHTML=texto
                }
        }
	xmlhttp.send(null);
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Na sua solução você insere o responseText para uma div. E na verdade não é isso que eu quero. Porque o script está em um js e ele se comunica com outras funções do próprio. Então não dá para inserir em uma div ou outro campo. Tô pensando em fazer com cookies, mas não estou achando uma boa idéia porque vai perder o dinamismo da minha aplicação.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Uai, basta trocar o div.innerHTML pela variável que você quer.

 

div.innerHTML=texto;
por

variavelGlobal=texto;

O resultado seria o mesmo.

 

Não. Não seria. Como eu disse anteriormente o "alerta 2" imprime "...".

Compartilhar este post


Link para o post
Compartilhar em outros sites

Calma lá...

 

Vamos devagar com o andor aí que o santo é de barro...

 

Muitas pessoas tem esse problema quando estão iniciando, inclusive eu tive...

 

Vou tentar explicar...

 

Um script é lido de modo contínuo. Ele não pára para esperar uma requisição AJAX...

 

Ao fazer a requisição AJAX, ela eh processada em separado, mas o script continua rodando...

 

Uma requisição leva um certo tempo até ser concluída, mas o segunto alert vai ser executado logo depois da requisição ter sido iniciada.

Se a requisição nao terminou, não há resposta, logo, o valor da variável não será alterado... http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

 

O único modo de fazer isso é exatamente quando a requisição termina (quando você verifica o readyState == 4 e o status == 200), fora disso, não há garantia que o alert seja chamado assim que a requisição termina...

Compartilhar este post


Link para o post
Compartilhar em outros sites

É. Eu me saquei nisso, ia até postar reformulando a pergunta. Mas ainda tenho uma dúvida, tem como eu retornar o responseText para outra função? Exemplo:

 


function pegaValor(){

   var ajax = new XMLHttpRequest();

   ajax.onreadystatechange = function(){

      if(ajax.readyState == 4){

		if(ajax.status == 200){
	  
         var variavel = ajax.responseText;

		 return variavel;
		 
		}
		 
      }

   }

   ajax.open("GET","retorna.php",true);

   ajax.send(null);

}

retorna.php

<?php

echo"Olá mundo!";

?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

tem como eu retornar o responseText para outra função?

De forma assíncrona à princípio não. Só se trabalhar de forma síncrona (é muito ruim, não recomendo) dá pra fazer.

 

Mas poste aí o que quer fazer. Provavelmente há outras maneiras de fazer algo parecido, mas depende do que vai fazer.

Compartilhar este post


Link para o post
Compartilhar em outros sites

?

 

if(ajax.readyState == 4){

                if(ajax.status == 200){
          
         var variavel = ajax.responseText;

                 umaFuncao( variavel );
                 
                }
                 
      }

...
function umaFuncao( response )
{
  alert( response );
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

É mais ou menos isso aqui:

 

<html>
<head>
	<title>...</title>

<script type="text/javascript">

var alerta = "...";

function pegaValor(){

	var ajax = new XMLHttpRequest();

	ajax.onreadystatechange = function(){

		if(ajax.readyState == 4){

			if(ajax.status == 200){
	  
				var variavel = ajax.responseText;
				
				teste(variavel);
		 
			}
		 
		}

	}

	ajax.open("GET","teste.php",true);

	ajax.send(null);

}

function teste(eco){
	
	alerta = eco;

}

function funcao(){

	pegaValor();
	
	alert(alerta);

}

</script>
</head>
<body onload="javascript:funcao()">
...
</body>
</html>

teste.php

<?php

echo"Ola mundo!";

?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Consegui resolver, mas a solução que eu arranjei acho que não é a das melhores, me falem o que acharam da solução.

 

<html>
<head>
	<title>...</title>

<script type="text/javascript">

var alerta = "...";

function setCookie(c_name,value,expiredays)
{
var exdate=new Date();
exdate.setDate(exdate.getDate()+expiredays);
document.cookie=c_name+ "=" +escape(value)+
((expiredays==null) ? "" : ";expires="+exdate.toGMTString());
}

function getCookie(c_name)
{
if (document.cookie.length>0)
  {
  c_start=document.cookie.indexOf(c_name + "=");
  if (c_start!=-1)
    {
    c_start=c_start + c_name.length+1;
    c_end=document.cookie.indexOf(";",c_start);
    if (c_end==-1) c_end=document.cookie.length;
    return unescape(document.cookie.substring(c_start,c_end));
    }
  }
return "";
}

function pegaValor(){

	var ajax = new XMLHttpRequest();

	ajax.onreadystatechange = function(){

		if(ajax.readyState == 4){

			if(ajax.status == 200){
	  
				var variavel = ajax.responseText;
				
				setCookie("getvalue",variavel,null);
		 
			}
		 
		}

	}

	ajax.open("GET","teste.php",true);

	ajax.send(null);

}

function funcao(){

	pegaValor();
	
	var alerta = getCookie("getvalue");
	
	alert(alerta);

}

</script>
</head>
<body onload="javascript:funcao()">

</body>
</html>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vi. E já tinha testado dessa maneira. Viu o meu post #10?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Consegui resolver, mas a solução que eu arranjei acho que não é a das melhores, me falem o que acharam da solução

Isso funciona ?

Cheguei a testar aqui a função e não funcionou, o alerta sempre vem em branco.

 

Explicando melhor:

Uma função não conseguirá retornar o valor de uma requisição assíncrona. Afinal, o código da função é executado de maneira mais ou menos independente de seu objeto AJAX (é por isso que existe a função onreadystatechange, você deve trabalhar com ela)

 

Mas se quiser você pode criar uma função "padronizada" para fazer uma requisição e, depois, fazer algo com o resultado.

Algo assim:

function Requisicao(pagina,funcao) {
    var ajax = new XMLHttpRequest();
    ajax.onreadystatechange = function () {
        if (ajax.readyState == 4) {
            if (ajax.status == 200) {
                if (typeof (funcao) == "function") {
                    funcao(ajax.responseText)
                }
            }
        }
    }
    ajax.open("GET", pagina, true);
    ajax.send(null);
}
E a utilização:

onload=function(){
    Requisicao("teste2.aspx",
    function (valor) {
        alert("O retorno do XMLHTTP foi:\n" + valor)
    })
}

Basicamente, foi passada como argumento para a função Requisicao a url da página (tudo normal até aí) e uma função com um parâmetro. A função Requisicao vai preparar a requisição de tal forma que, quando ela terminar, será chamada a função passada como segundo parâmetro e essa função terá como primeiro argumento o retorno da requisição.

 

Fica meio complicado entender pelo que eu falei, mas acho que com o exemplo dá pra entender melhor.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Isso funciona ?

Cheguei a testar aqui a função e não funcionou, o alerta sempre vem em branco.

Funcionou tranquilo comigo.

 

Olha na url: http://teachware.com.br/teste2.htm

 

Verifica o arquivo da requisição "teste.php", o meu teste.php aqui é assim:

 

<?php
echo"Olá Mundo!";
?>

E no caso o seu script só funciona no onload da página?

 

onload=function(){
    Requisicao("teste2.aspx",
    function (valor) {
        alert("O retorno do XMLHTTP foi:\n" + valor)
    })
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

E no caso o seu script só funciona no onload da página?

Não, funciona em qualquer parte do código.

Funcionou tranquilo comigo.

Mas no caso de seu script, testei aqui e não funcionou. O que acho possível é que você tenha salvo o cookie na primeira requisição e não tenha funcionado, e depois como o cookie já estava lá funcionou.

 

Edit:

É isso mesmo, acabei de testar no link que você postou. Na primeira vez, ficou em branco. Na segunda, mostrou o texto porque já estava salvo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

É isso mesmo, acabei de testar no link que você postou. Na primeira vez, ficou em branco. Na segunda, mostrou o texto porque já estava salvo.

 

É. Mas no caso isso também é um problema. Da primeira vez estar em branco. Qual será o motivo disso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acontece o mesmo que no script usando variável global. O valor é alterado depois do alert, sendo assim, não adianta.

Se quiser faça alguns testes com a função que postei, provavelmente ela será mais adequada ao seu caso.

Compartilhar este post


Link para o post
Compartilhar em outros sites

É. cara, tentei. Mas o que eu realmente queria fazer, eu vi que não é possível. No caso eu queria que executa-se o script só quando tivesse o retorno do ajax. E no tipo de api que estou desenvolvendo não tem essa possibilidade. E até em termos lógicos, não há muita lógica em fazer dessa maneira. Mas mesmo assim valeu pela ajuda.

 

http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se você quer passar o retorno da requisição para outra função, faça assim:

 

...
if(requisicao.status == 200){
 var resposta = requisicao.responseText;
 outrafunção(resposta);
}

Aí funcionaria...

 

Dê uma olhada nos exemplos de uso, não entendi mto bem o que você quer, mas veja se algum se encaixa no que precisa...

http://forum.imasters.com.br/public/style_emoticons/default/seta.gif http://forum.imasters.com.br/index.php?/topic/359316-classe-ajax/

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.