Ir para conteúdo

POWERED BY:

Arquivado

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

Claudio Neto

[Resolvido] Executar um alert usando XMLHTTP

Recommended Posts

Seguinte, tenho uma estrutura assim:

function pingar()
{
	var ping1 = createXMLHTTP();
	ping1.open("post", "ajax.asp", true);
	ping1.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
	ping1.onreadystatechange=function(){
	if (ping1.readyState==4){
		document.getElementById("divpingado1").innerHTML = ping1.responseText;}
	}
	ping1.send('acao=123');

}
var intervalo = window.setInterval('pingar()', 2000);

Então a função pingar se conecta com a página ajax.asp, lê tudo que tem que ler de acordo com a variável passada (acao) e retorna um resultado no objeto 'divpingado1'

 

Tudo funciona, mas preciso que no resultado de ping1.respondeText venha uma função javascript, uma chamada de alert por exemplo. E isso não acoentece.

Na página ajax.asp tentei fazer assim:

<script>
alert('teste');
</script>
E não acontece nada. Ai coloquei com um botão:

<input type="button" onclick="alert('teste');" value="Clique" />
Ai dá certo. Só que não posso deixar esse botão, tem que ser automático.

Alguém sabe como posso resolver isso?

 

Desde já meu muito obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Na página ajax.asp tentei fazer assim:

<script>
alert('teste');
</script>
E não acontece nada.

 

Mas você escreveu isso assim exatamente ?

ou você deu um Response.Write ?

 

Você não pode 'fazer o alert' como função de callback do pingar() ?

 

Tópico Movido:

Webstandards: CSS / XML / XHTML / HTML http://forum.imasters.com.br/public/style_emoticons/default/seta.gif Javascript/DHTML >> AJAX

Compartilhar este post


Link para o post
Compartilhar em outros sites

a ajax.asp SÓ VAI RETORNAR o seguinte:

alert('teste')

e na pg principal (pingar sei lá) utilize o eval

eval(ping1.responseText)

só uma dica:

A maneira mais correta de trabalhar com isso é enviando um objeto JSON como resposta

Compartilhar este post


Link para o post
Compartilhar em outros sites

Está fora do ASP isso Bruno, por isso não coloquei response.write.

 

O alert será executado se uma condição em asp for verdadeira, não vejo muito como poderia colocar dentro da função pingar.

Assim:

<%
if not rs.eof then
%>
<script>
alert('teste');
</script>
<%
end if
%>

Obrigado por mover, depois que postei me toquei que estava no lugar errado, mas não podia fazer mais nada.

Compartilhar este post


Link para o post
Compartilhar em outros sites

a ajax.asp SÓ VAI RETORNAR o seguinte:

alert('teste')

e na pg principal (pingar sei lá) utilize o eval

eval(ping1.responseText)

só uma dica:

A maneira mais correta de trabalhar com isso é enviando um objeto JSON como resposta

 

Olá Evando, obrigado pelo dica. Pelo que li é a forma correta realmente de fazer.

Mas acho que não consegui chegar no ponto certo. Ficou assim:

<script>
function pingar()
{
	var ping1 = createXMLHTTP();
	ping1.open("post", "ajax.asp", true);
	ping1.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
	ping1.onreadystatechange=function(){
	if (ping1.readyState==4){
		eval('var objJson='+ping1.responseText+'')
		document.getElementById("divpingado1").innerHTML = objJson.html;
		eval(objJson.js);}
	}
	ping1.send('acao=123');

}
var intervalo = window.setInterval('pingar()', 2000);

</script>
Acredito que preciso declarar o objJson, mas não encontrei como o fazer.

 

E ajax.asp ficou assim:

<%
if not rsAtend.eof then
	session("chamado") = rsAtend("id")
%>
	{"html":"<span>Achou</span>","js":"alert('teste')"}
<%
	rsAtend("ping") = FormataData(now)
	rsAtend.update
else
	response.write "Não achou nada"
end if
%>

Compartilhar este post


Link para o post
Compartilhar em outros sites

O alert será executado se uma condição em asp for verdadeira, não vejo muito como poderia colocar dentro da função pingar.

 

Cara, a forma simples.. retorna: 'Condição Verdadeira'

e então:

 

if( ping1.responseText=='Condição Verdadeira' )
  alert('teste');

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hehe, verdade né Bruno...

 

Assim deu certo sim. Mas fiquei curioso pelo caso do Json, achei muito bom. Se o Evandro ainda puder tentar explicar o que fiz de errado, agradeço...

 

-- unidos --

Bruno, você que pôs como resolvido? Retire por favor, quero aguardar a explicação do método via Json antes de dizer que está resolvido.

 

Beleza?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Okay ^_^

dá uma olhada.. ainda não consegui pensar numa boa aplicação disso.. acho que fiquei preguiçoso, depois que comecei a usar jQuery..

 

<script type="text/javascript">
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) {}
		}
	}
}
function consultar()
{
    ajax = getHTTPObject();
    ajax.onreadystatechange = function()
	{
		if(ajax.readyState == 4)
		{
			eval( ajax.responseText );//note que não usei nenhum alert por aqui
		}	
	}
    ajax.open("GET", "function.inc.php", true);
    ajax.send(null);
}
</script>
	<a href="javascript:consultar();">Teste</a>
function.inc.php
<?php

	echo "[alert('teste')]";
mas sei lá, jSON não entra bem nesse contexto.. o eval() vai tentar executar a string de qq jeito, você criando o objeto em notação javascript(acronimo JS Object Notation) ou não.

Compartilhar este post


Link para o post
Compartilhar em outros sites

literatura:

http://www.hunlock.com/blogs/Mastering_JSON_(_JavaScript_Object_Notation_)

 

 

exemplo de resposta JSON Server-Side:

http://api.flickr.com/services/feeds/photos_public.gne?tags=cat&tagmode=any&format=json&jsoncallback=?

 

 

 

 

acho que como manipular o XMLHTTP você já está craque, não? então trabalharemos aonde interessa, dentro de if(ping1.readyState == 4){

No primeiro link que te mandei, existe um bloco que diz JSON via parse. É meu método favorito quando não estou utilizando jQuery

 

 

// The following block implements the string.parseJSON method
(function (s) {
  // This prototype has been released into the Public Domain, 2007-03-20
  // Original Authorship: Douglas Crockford
  // Originating Website: http://www.JSON.org
  // Originating URL    : http://www.JSON.org/JSON.js

  // Augment String.prototype. We do this in an immediate anonymous function to
  // avoid defining global variables.

  // m is a table of character substitutions.

  var m = {
    '\b': '\\b',
    '\t': '\\t',
    '\n': '\\n',
    '\f': '\\f',
    '\r': '\\r',
    '"' : '\\"',
    '\\': '\\\\'
  };

  s.parseJSON = function (filter) {

    // Parsing happens in three stages. In the first stage, we run the text against
    // a regular expression which looks for non-JSON characters. We are especially
    // concerned with '()' and 'new' because they can cause invocation, and '='
    // because it can cause mutation. But just to be safe, we will reject all
    // unexpected characters.

    try {
      if (/^("(\\.|[^"\\\n\r])*?"|[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t])+?$/.
        test(this)) {

          // In the second stage we use the eval function to compile the text into a
          // JavaScript structure. The '{' operator is subject to a syntactic ambiguity
          // in JavaScript: it can begin a block or an object literal. We wrap the text
          // in parens to eliminate the ambiguity.

          var j = eval('(' + this + ')');

          // In the optional third stage, we recursively walk the new structure, passing
          // each name/value pair to a filter function for possible transformation.

          if (typeof filter === 'function') {

            function walk(k, v) {
              if (v && typeof v === 'object') {
                for (var i in v) {
                  if (v.hasOwnProperty(i)) {
                    v[i] = walk(i, v[i]);
                  }
                }
              }
              return filter(k, v);
            }

            j = walk('', j);
          }
          return j;
        }
      } catch (e) {

      // Fall through if the regexp test fails.

      }
      throw new SyntaxError("parseJSON");
    };
  }
) (String.prototype);
// End public domain parseJSON block

 

 

criado o protótipo, dentro da condicional readyState == 4, iremos receber nossos dados JSON:

var myData = ping1.responseText.parseJSON();

Se aprendeu corretamente a estrutura do JSON, você ja estará pronto para manipular e trabalhar todas as propriedades do objeto myData

Compartilhar este post


Link para o post
Compartilhar em outros sites

segue um exemplo rapido:

 

index.html

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Insert title here</title>
<script type="text/javascript" src="parsejson.js"></script>
<script type="text/javascript" src="ajax.js"></script>
</head>
<body>
	<form action="" method="get">
		<fieldset>
			<label>Procure um nome: <input type="text" name="nome" /></label>
			<label><input type="button" value="OK" onclick="ajax.send('nome=' + this.form.nome.value)" /></label>
		</fieldset>
	</form>
</body>
</html>

o arquivo parsejson.js não é nada mais que eu colei no spoiler do post anterior

 

ajax.js

var ajax = new XMLHttpRequest();
	ajax.open('POST','buscanome.php',true)
	ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
	ajax.onreadystatechange = function(){
		if(this.readyState == 4 && this.status == 200){
			dados = this.responseText.parseJSON();
			if(dados.length == 0) alert('Nenhum registro!');
			alert(dados[0].nome + ' tem ' + dados[0].idade + ' anos.');
		}
	}

buscanome.php

<?php
$lista = array(
	array('José','12'),
	array('Jair','15'),
	array('João','18'),
	array('Maria','13'),
	array('Marta','21'),
	array('Ana','17')
);

$busca = $_POST['nome'];
echo '[';
foreach($lista as $nome) {
	if(in_array($busca,$nome)) echo '{ "nome": "'.$nome[0].'", "idade": '.$nome[1].' }';
}
echo ']';
?>

 

Vi que está programando em ASP e não sei quais seus conhecimentos em PHP, mas já declaro que não há nada de mais ali.

Criei uma array de arrays [tabela/matriz] contendo Nome/Idade de uns exemplos, recuperei o valor passado via AJAX e percorri valor por valor atrás do nome recebido.

 

Em PHP, é possível se utilizar de um par de funções chamadas json_encode/decode() que fazem o serviço sujo.

Não tenho conhecimentos de ASP e não sei se é possível algo parecido.

 

 

Uma recomendação particular:

Envolva os DADOS a serem trabalhados em uma array [] e depois separe-os em objetos {}

Fica super prático localizar o dado que você deseja, pois os elementos se estruturam como tabela

 

dados[99].Nome

Estou procurando na centésima linha (a linha 0 conta), a coluna de nome Nome

 

Outra vantagem é a contagem ou manipulação de linhas, através da propriedade length.

 

"Sua busca retornou <b>" + dados.length + "</b> resultados.";

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ok, obrigado aos dois.

 

Deixa eu ver se entendi. Não sei se esse seria o termo correto, mas o que o JSON faz é criar uma variável estruturada? Achei interessante, mas na verdade o que me fará realmente executar o alert é o eval mesmo né, não o fato de estar usando JSON, estou certo?

 

Caso seja isso, o meu não dá certo. Usando o eval, não abre minha funçao em JS.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim, JSON é uma linguagem para transporte de dados assim como XML e CVS

 

fazendo uma série de requisições e adaptações no JSON é possível jogar o 'alert' para fora do eval.

exemplo:

 

 

busca por nomes, encontra 2 pessoas:

({
    "errno": 0,
    "error": "",
    "data": [
        {"nome": "Evandro"},
        {"nome": "Claudio"}
    ]
})

busca por nomes, não encontra nenhum:

({
    "errno": 1050,
    "error": "Nenhum nome encontrado!",
    "data": []
})

na manipulação do JSON viria algo assim [suponhamos que você já enviou os dados json pra uma variável chamada jsonData]

if (jsonData.errno) alert(jsonData.error)

 

vou tentar levar um pouco mais perto de você

 

pingamos o servidor, e a resposta AJAX são as informações do servidor de ping

sem erros

({
    "errors": false,
    "host": "127.0.0.1",
    "ping": 33,
    "latency": 50,
    "status": "online"
})

com erro:

({
    "errors": "host not found!",
    "host": "8.5.6.6",
    "ping": "t/o",
    "latency": "n/a",
    "status": "offline"
})

 

manipulação

if (!jsonData.errors) {
    var info = document.getElementById('info');
    info.getElementById('host').innerHTML = jsonData.host;
    info.getElementById('ping').innerHTML = jsonData.ping + 'ms';
    info.getElementById('latency').innerHTML = jsonData.latency + 'ms';
    info.getElementById('status').innerHTML = jsonData.status;
}
else alert(jsonData.errors);

Compartilhar este post


Link para o post
Compartilhar em outros sites

Deixa eu ver se entendi. Não sei se esse seria o termo correto, mas o que o JSON faz é criar uma variável estruturada? Achei interessante, mas na verdade o que me fará realmente executar o alert é o eval mesmo né, não o fato de estar usando JSON, estou certo?

 

Exatamente isso.

 

como eu disse, você não precisa de jSON para fazer aquilo, como demonstrei no exemplo.

se fizer apenas: echo "alert('teste')";

 

ja funciona.

Como é a sua função?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi Bruno.

 

Então, é um window.open, mas também testei com o alert e não deu.

Não preciso escrever as tags script né? Basta passar a função...

 

O JS ficou assim:

function pingar()
{
	var ping1 = createXMLHTTP();
	ping1.open("post", "ajax.asp", true);
	//ping1.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
	ping1.onreadystatechange=function(){
		if (ping1.readyState==4){
			//alert(ping1.responseText);
			/*if(parseInt(ping1.responseText) == 1){
				//document.getElementById("divpingado1").innerHTML = ping1.responseText;
				//alert('existe um chat tentando ser aberto');
				window.open('pagina.asp','Atendimento','scrollbars=no,status=no,width=355,height=380,left=20,top=10,resizable=no');
			}
			*/
			eval( ping1.responseText );
		}
	}
	/*
	teste usando JSon
	if (ping1.readyState==4){
		var objJson = eval(''+ping1.responseText+'');
		document.getElementById("divpingado1").innerHTML = objJson.html;
		//eval(objJson.js);}
	}
	*/
	ping1.send('acao=123');

}
var intervalo = window.setInterval('pingar()', 2000);

E estou passando assim em ASP:

response.write "window.open('pagina.asp','Atendimento','scrollbars=no,status=no,width=355,height=380,left=20,top=10,resizable=no');"
Nota: response.write(ASP)=echo(PHP)

 

Está correto?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, não vi 'nenhum erro'. Mas também não costumo fazer isso..

o alert te retorna a string certinha ? //alert(ping1.responseText);

 

estranho não ter funcionado nem com o alert.. pois no exemplo que postei em: #8 , funciona certinho..

 

 

fiz o mesmo teste com o código que postei em #8, apenas trocando:

<?php
	echo "window.open('pagina.asp','Atendimento','scrollbars=no,status=no,width=355,height=380,left=20,top=10,resizable=no');";
e funcionou perfeito. Apesar do navegador ter bloquiado o popup.

 

É possível que seja alguma coisa particular do ASP ou do servidor ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi Bruno, graças a sua ajuda descobri o que estava acontencedo. E boas, está funcionando. Seguinte, minha comparação em JS está assim:

if(parseInt(ping1.responseText) == 1){
	alert(ping1.responseText);
}

O que estava acontecendo é que, na parte em asp, tinha uma parte de código em HTML que estava comentada assim:

if not rsAtend.eof then
	session("chamado") = rsAtend("id")
	response.write 1
%>
<!--
	{"html":"1","js":"window.open('http://importebr.com.br/webadmin/admin/atendimento/atendimento_auto.asp','Atendimento','scrollbars=no,status=no,width=355,height=380,left=20,top=10,resizable=no');"}
-->
<%
else
	response.write 0
end if

Achei que por estar comentado, ele estaria ignorando essa parte e nem teria problema, mas não foi o que aconteceu.

Quando coloquei um alert fora da condição no JS, ele me retorno assim quando no ASP foi verdadeiro:

 

Então a condição nunca era verdadeira.

 

Tirei a parte comentada e deu certo.

Agora para poder continuar com a comparação e a execução, usuarei o JSON, conforme recomendação do Evandro.

 

Agora sim, pode dar como resolvido que está tudo funfando perfeitamente.

 

Muito obrigado aos dois e a todos que leram e ao menos tentaram ajudar.

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.