Problemas com AJAX

3 respostas
M
Caros amigos, Sei que este é um fórum de Java, mas ando tendo alguns problemas com AJAX e, como muitos de vocês possuem um grande conhecimento em desenvolvimento web, resolvi publicar esta dúvida, contando sempre com a boa vintade de vocês do GUJota. Preciso fazer numa página uma requisição assíncrona para outra página e, desta última retirar um nó para que seja inserido na primeira. Tenho um código Javascript bem assim:
<script>
		function XMLHTTPRequestFactory(){
			this.getXMLHTTPRequest = function(){
				var request = false;
				if(window.XMLHttpRequest){
					request = new XMLHttpRequest();
				}else if (window.ActiveXObject){
					var versions = ["MSXML2.XMLHttp.6.0", "MSXML2.XMLHttp.5.0", "MSXML2.XMLHttp.3.0", "MSXML2.XMLHttp", "Microsoft.XMLHttp"];
					for (var i = 0; i < versions.length; i++){
						try{
							request = new ActiveXOBject(versions[i]);
							return request;
						} catch (ex){
							//exceções esperadas
						}
					}
				}
				return request;
			}
		}
		
		function getDocument(url){
			var request = new XMLHTTPRequestFactory().getXMLHTTPRequest();
			if(request){
				request.open("GET", url + "?key=" + new Date().getTime(), true);
				request.onreadystatechange = function(){
		 			if(request.readyState == 4){
						if(request.status == 200){
							xmlDoc = null;
							try {//Internet Explorer
  								xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
								xmlDoc.async="false";
								xmlDoc.loadXML(request.responseText);
							}catch(e){
								try {//Firefox, Mozilla, Opera, etc.
									parser=new DOMParser();
									xmlDoc=parser.parseFromString(request.responseText,"text/xml");
									document.getElementById("sideMenu").innerHTML = xmlDoc.getElementById("side-menu");
								}catch(e){
									window.alert(e.message)
								}
  							}

						} else {
							window.alert("Houve um problema ao executar requisição!");
						}
					}
				}
			}else{
				window.alert("Sem requisições assíncronas!");
			}
			request.send(null);
		}
	</script>
Ocorre que consigo fazer a requisição, obtenho a pagina em um string e crio o documento, mas quando tento apanhar o nó, está sempre vazio. Alguém pode me ajudar? Obrigado a todos! Shalom!!!

3 Respostas

ze_kiefa

Minha sugestão é usar JQuery, pois ele facilita horrores na hora de implementar.
Ele aceita um arquivo XML ou JSON para recuperar os dados.

Segue um pequeno exemplo e o link para download e de mais demos.

<script language="text/javascript">

$(document.ready(function(){

// requisição Ajax
$.ajax({ 
				url:	"qualquerPaginaQueRetonaXML_JSON.jsp", 
				data:	"xParametro=valorParametro", 
				dataType: "xml", 
				success: function(xml){
					var _id  = "";
					var _name = "";
					
					$(xml).find("opcao").each(function(){
						_id	= $(this).find("id", this).text();
						_name	= $(this).find("name", this).text();
						
						/*
                                                  processe os dados do retorno aqui
                                                 */ 
					}); // xml
				} // success
			}); // ajax

// eventos da requisição AJAX
$("#divMensagem").ajaxSend(function(){
		$(this).html("Consultando parâmetros.");
		$(this).show();
	 });

$("#divMensagem").ajaxComplete(function(){
		$(this).html("Requisição completa.");
		$(this).show();
	 });

$("#divMensagem").ajaxError(function(){
		$(this).html("Erro ao carregar parâmetros.");
		$(this).show();
	 });

});

</script>

O arquivo XML gerado

<?xml version="1.0" encoding="ISO-8859-1" ?>
<opcoes>
 <opcao>
  <id>1</id>
  <name>GUJ</name>
 </opcao>
 <opcao>
  <id>2</id>
  <name>AJAX</name>
 </opcao>
 <opcao>
  <id>3</id>
  <name>JQuery</name>
 </opcao>
</opcoes>

Mais informações:
JQuery
Download
JQuery + AJAX

M

Obrigado pela dica! Eu acho que vou usar o JSON em outros projetos! Mas neste não dá! eu não tenho acesso ao source da pagina que quero chamar dinamicamente!
Shalom!!!

M
Ficou podre, moçada, mas eu resolvi! Ficou mais ou menos assim:
<script>
		function XMLHTTPRequestFactory(){
			this.getXMLHTTPRequest = function(){
				var request = false;
				if(window.XMLHttpRequest){
					request = new XMLHttpRequest();
				}else if (window.ActiveXObject){
					var versions = ["MSXML2.XMLHttp.6.0", "MSXML2.XMLHttp.5.0", "MSXML2.XMLHttp.3.0", "MSXML2.XMLHttp", "Microsoft.XMLHttp"];
					for (var i = 0; i < versions.length; i++){
						try{
							request = new ActiveXOBject(versions[i]);
							return request;
						} catch (ex){
							//exceções esperadas
						}
					}
				}
				return request;
			}
		}
		
		function getDocument(url){
			var request = new XMLHTTPRequestFactory().getXMLHTTPRequest();
			if(request){
				request.open("GET", url + "?key=" + new Date().getTime(), true);
				request.onreadystatechange = function(){
		 			if(request.readyState == 4){
						if(request.status == 200){
							var sidemenu = request.responseText.substring(request.responseText.lastIndexOf('<div id="side-menu">'));
							sidemenu = sidemenu.substring(0, sidemenu.indexOf('</div>'));
							sidemenu += "</div>";
							var anotherRequest = new XMLHTTPRequestFactory().getXMLHTTPRequest();
							anotherRequest.open("GET", url + "?key=" + new Date().getTime(), true);
							anotherRequest.onreadystatechange = function(){
		 						if(anotherRequest.readyState == 4){
									if(anotherRequest.status == 200){
										document.write(anotherRequest.responseText.substring(0, anotherRequest.responseText.lastIndexOf('<div id="sideMenu">')) + sidemenu + anotherRequest.responseText.substring(anotherRequest.responseText.lastIndexOf('<div id="sideMenu">')));
									}
								}
							}
							anotherRequest.send(null);
						} else {
							window.alert("Houve um problema ao executar requisição!");
						}
					}
				}
			}else{
				window.alert("Sem requisições assíncronas!");
			}
			request.send(null);
		}
	</script>
Não era o que eu queria fazer, mas salvou o dia! Depois eu tento melhorar o código e publico aqui! Obrigado a todos! San
Criado 12 de agosto de 2008
Ultima resposta 13 de ago. de 2008
Respostas 3
Participantes 2