Ajax no IE

12 respostas
H

Pessoal,

estou usando Ajax e nao estou conseguindo fazer manipulação do XML recebido com o IE, no Firefox funciona que é uma maravilha! os JavaScripts que compõe as funções são os seguintes:

var objetos = [];

var req;

function ajaxInit()
{
	if (window.XMLHttpRequest)
	{
    	return new XMLHttpRequest();
    }
    else if (window.ActiveXObject)
    {
    	return new ActiveXObject("Microsoft.XMLHTTP");
    }
}


function callback() 
{
    if (req.readyState == 4) 
    {
        if (req.status == 200) 
        {
            var objetos = req.responseXML.getElementsByTagName("mensagem")[0];
			alert(objetos.getElementsByTagName("nome").length);
        }
    }
}


function processRequest(url)
{
	if(req == null)
	{
		req = ajaxInit();
	}
	
	req.open("GET", url, true);
	req.onreadystatechange = callback;
	req.send(null);
}

O problema está na função callback(), onde tem o alert(). Com o Firefox funciona muito bem, mas com o IE não vai nem a pau!

Só pra colocar mais informações o JSP faz o submit Ajax para um Servlet que retorna o XML.

O que devo fazer para compatilizar isso com o IE?

12 Respostas

TLCC

no site da java magazine tem um exemplo muito bom para iniciar o protocolo em qq navegador, um código que segundo eles, é quase um padrão para AJAX hehhe

http://www.javamagazine.com.br/downloads/jm28/jm28-ajax.zip

baixe o código o js esta dentro de um arquivo jsp

abs

H

TLCC:
no site da java magazine tem um exemplo muito bom para iniciar o protocolo em qq navegador, um código que segundo eles, é quase um padrão para AJAX hehhe

http://www.javamagazine.com.br/downloads/jm28/jm28-ajax.zip

baixe o código o js esta dentro de um arquivo jsp

abs

Então,

eu verifiquei o código e o que ele faz diferente é pegar o valor como um texto:

xmlhttp.responseText

e depois processar isso com o eval() que eu não exatamente pra que serve, acho que para transformar isso em um objeto.

e aí ele processa tudo da seguinte forma:

var data = eval(xmlhttp.responseText);

que no Firefox funciona muito bem! e no IE dá erro.

Alguma outra sugestão?

J

Poderias colocar a mensagem de erro que aparece no IE?

Verifique se não aparecem mais de uma, caso tenha mais de uma, vá para a primeira delas e coloque aqui.

Só pra esclarecer, mas você tem setado lá no seu servlet o response como sendo pra XML ??

H

julianostr:
Poderias colocar a mensagem de erro que aparece no IE?

Verifique se não aparecem mais de uma, caso tenha mais de uma, vá para a primeira delas e coloque aqui.

Só pra esclarecer, mas você tem setado lá no seu servlet o response como sendo pra XML ??

Então, vamos lá…

No servlet eu setei o retorno da seguinte forma:

response.setContentType("text/xml");

O erro que aparece no IE é o seguinte:

Linha: 62
Erro: Erro de sintaxe

A linha 62 é a seguinte:

var data = eval(xmlhttp.responseText);
J

Ops, confirme aí, se for um XML que o servlet retorna então você deverá usar responseXML e não responseText, certo?

Verifique isso primeiro…

H

julianostr:
Ops, confirme aí, se for um XML que o servlet retorna então você deverá usar responseXML e não responseText, certo?

Verifique isso primeiro…

Então…

eu já tentei dos dois!

o Curioso é o fato de que quando faço um alert(xmlhttp.responseText); o XML retornado pela Servlet é apresentado normalmente em ambos os browsers, mas ao tentar iterar com o responseXML funciona no Firefox mas não no IE.

J

Ok, você tentou os dois, mas o correto para XML é responseXML, certo?

Utilize a função abaixo pra designar o objeto correto com relação ao browser.

function XMLHTTPRequest() {
          if (window.XMLHttpRequest) { 
              a=new XMLHttpRequest(); } //Objeto nativo (FF/Safari/Opera7.6+)
          else {
            try { 
               a=new ActiveXObject("Msxml2.XMLHTTP");  //activeX (IE5.5+/MSXML2+)
            }   
            catch(e) {
              try { 
                 a=new ActiveXObject("Microsoft.XMLHTTP"); //activeX (IE5+/MSXML1)
              }   
              catch(e) { /* O navegador não tem suporte */ 
                 a=false; 
              }
            }
          } 
          return a;
        }

Substitua a sua ajaxInit por essa função e tenta de novo.

J

Um exemplo pra iteração com os elementos do XML retornado pelo servlet:

function criaTabela(ajaxResponse)
{
var data = ajaxResponse.getElementsByTagName("atividade");
var htmlText = "<table border='1' >"+
			   "   <tr>"+
			   "     <th>Descrição</th>"+
			   "	 <th>Data Inicial</th>"+
			   "	 <th>Data Final</th>"+
			   "   </tr>"
	for(i=0;i<data.length;i++)
	{
       var desc = data[i].getElementsByTagName("descricao").item(0);
       var dataInicial = data[i].getElementsByTagName("dataInicial").item(0);
       var dataFinal = data[i].getElementsByTagName("dataFinal").item(0);
	   htmlText=htmlText+"<tr><td>"+
	       desc.firstChild.data+"</td><td>"+
	       dataInicial.firstChild.data+"</td><td>"+
	       dataFinal.firstChild.data+"</td><td></tr>";
	}
	htmlText=htmlText+"</table>";
	document.getElementById("tabela").innerHTML=htmlText;
}
H

julianostr:
Ok, você tentou os dois, mas o correto para XML é responseXML, certo?

Utilize a função abaixo pra designar o objeto correto com relação ao browser.

function XMLHTTPRequest() {
          if (window.XMLHttpRequest) { 
              a=new XMLHttpRequest(); } //Objeto nativo (FF/Safari/Opera7.6+)
          else {
            try { 
               a=new ActiveXObject("Msxml2.XMLHTTP");  //activeX (IE5.5+/MSXML2+)
            }   
            catch(e) {
              try { 
                 a=new ActiveXObject("Microsoft.XMLHTTP"); //activeX (IE5+/MSXML1)
              }   
              catch(e) { /* O navegador não tem suporte */ 
                 a=false; 
              }
            }
          } 
          return a;
        }

Substitua a sua ajaxInit por essa função e tenta de novo.

Sim, o correto até onde eu sei é o responseXML.

Bom, eu substituí meu initAjax() pela sua function, e na function processRequest eu alterei a chamada para o seu método da seguinte forma:

function processRequest(url)
{
	if(xmlhttp == null)
	{
		//xmlhttp = ajaxInit();
		xmlhttp = XMLHTTPRequest();
	}
	
	xmlhttp.open("GET", url, true);
	xmlhttp.onreadystatechange = callback;
	xmlhttp.send(null);
}

Resultado: Funciona no Firefox e não funciona no IE.

Cara, eu to começando achar q o IE está de marcação comigo… hehehe

Não é possível uma coisa dessa, eu já apliquei Ajax com IE e nunca tive problemas, a minha versão do IE é a 6.0

Mais sugestões… ?

J

Os fontes que lhe passei funcionam aqui no IE 6 e no FireFox, sem problemas.

Tem certeza que você não está esquecendo um detalhe que possa estar dando erro no IE e tb no FireFox, porém, o FireFox está “mascarando o erro” ??

Veja o console de javascript pra confirmar.

H

julianostr:
Os fontes que lhe passei funcionam aqui no IE 6 e no FireFox, sem problemas.

Tem certeza que você não está esquecendo um detalhe que possa estar dando erro no IE e tb no FireFox, porém, o FireFox está “mascarando o erro” ??

Veja o console de javascript pra confirmar.

Vou rever tudo novamente, mas no FF não apresenta nenhum erro no JavaScriptConsole.

H

Aí pessoal! Achei o problema!

Eu estava configurando o Encoding do XML como:

<?xml version="1.0" encoding="UTF-8"?>

e o correto para se ter acentuação é utlizar o padrão:

<?xml version="1.0" encoding="ISO-8859-1"?>

Curioso o fato do Firefox não se preocupar com isso e exibir a acentuação mesmo com o padrão do arquivo errado.

Obrigado a todos por terem dado suas dicas!

Criado 6 de junho de 2006
Ultima resposta 7 de jun. de 2006
Respostas 12
Participantes 3