Ver Mensaje Individual
  #1 (permalink)  
Antiguo 03/07/2009, 08:07
Avatar de anf
anf
 
Fecha de Ingreso: junio-2009
Mensajes: 30
Antigüedad: 15 años
Puntos: 4
De acuerdo [Solucionado] AJAX Novatos, código de ejemplo y duda.

Hola amigos, antes de plantear mi duda quisiera colaborar con mi pequeño granito de arena, esto es un pequeño código JavaScript que funciona actualmente y que puede ayudaros a empezar en el mundo de AJAX si no tenéis nada de experiencia.

Primero lo esencial, la función de llamada:

Código:
function getXMLHTTPRequest() {
	var r = false;
	try { r = new XMLHttpRequest(); } /* Navegadores competentes */
	catch(e) {
		try { r = new ActiveXObject("Msxml2.XMLHTTP"); } /* Algunas versiones de IE */
		catch(e) {
			try { r = new ActiveXObject("Microsoft.XMLHTTP"); } /* Otras versiones de IE */
			catch(e) { r = false; }
		}
	}
	return r;
}
Creamos la llamada:

Código:
var http = getXMLHTTPRequest();
Ahora llamada y retorno:

Código:
function callPage(page) {
	trash = parseInt(Math.random()*999999999); /* Esto evita el cacheo de páginas */
	url = page + "&trash=" + trash;
	try {
		http.open("GET", url, true);
		http.onreadystatechange = tracePage;
		http.send(null);
	}
	catch(e){
		alert('Mensaje de error si no puede hacer la peticion.');
	}
	finally{}
}
Y ahora el proceso:

Código:
function tracePage() {
	if (http.readyState == 4) {
		if (http.status == 200) {
			var r = http.responseText; /* Se puede recibir en XML o en String (Text) */
			document.getElementById("ajax").innerHTML = r; /* Crea un <div id='ajax'></div> para ver el resultado. */
		}
	} 
}
Uso, en tu página pon algun evento Javascript, por ejemplo un onClick para que haga un:
Código:
callPage("miPagina.php?saludo=Hola");
miPagina.php:

Código PHP:
<?php print "Esto es una prueba simple de AJAX. ¡".$_GET["saludo"]." mundo!"?>
HTML de ejemplo (sin doctype, encoding etc..., simple):

Código HTML:
<html>
<head>
<title>AJAX</title>
<script type="text/javascript">
function getXMLHTTPRequest() {
	var r = false;
	try { r = new XMLHttpRequest(); } /* Navegadores competentes */
	catch(e) {
		try { r = new ActiveXObject("Msxml2.XMLHTTP"); } /* Algunas versiones de IE */
		catch(e) {
			try { r = new ActiveXObject("Microsoft.XMLHTTP"); } /* Otras versiones de IE */
			catch(e) { r = false; }
		}
	}
	return r;
}
var http = getXMLHTTPRequest(); /* http tiene que ser una variable global, y puede llamarse miPeticion o como quieras */
function callPage(page) {
	trash = parseInt(Math.random()*999999999); /* Esto evita el cacheo de las páginas */
	url = page + "&trash=" + trash;
	try {
		http.open("GET", url, true);
		http.onreadystatechange = tracePage;
		http.send(null);
	}
	catch(e){
		alert('Mensaje de error si no puede hacer la peticion.');
	}
	finally{}
}
function tracePage() {
	if (http.readyState == 4) {
		if (http.status == 200) {
			var r = http.responseText; /* Se puede recibir en XML o en String (Text) */
			document.getElementById("ajax").innerHTML = r; /* Crea un <div id='ajax'></div> para ver el resultado. */
		}
	} 
}
</script>
</head>
<body>
<a href='#' onclick="javascript:callPage('miPagina.php?saludo=Hola');">Pincha aqui</a>
<hr />
<div id='ajax'>Ahora mismo no hay nada aquí.</div>
</body>
</html> 
bueno, básicamente es una idea, me tengo que ir a currar en 5minutos y tengo algo de prisa, si alguien no entiende nada o necesita una explicacion detallada estoy encantado de responder todo lo que surja, toda esta información la puedes encontrar en los video tutoriales de Jesús Conde, ahora voy con mi problema:

Tengo una petición que desearía meter en un array, necesito abrir 25 hilos XMLHttpRequest para que cada uno de ellos pida una informacion a un sitio distinto y vayan apareciendo en la pagina los resultados en 25 divs, actualmente lo tengo funcionando en cadena, o en serie, quiere decir que primero lanza el 1 y si no termina no lanza el 2, asi hasta el 25, mi idea es lanzar los 25 de golpe y segun vayan llegando leerlos y actualizar los datos, lo que tengo ahora mismo es esto:

Código:
var httpDomain = new Array();
var tld = 0; /* global */
function domainSearch (domain) {
	for (tld = 0; tld <= 25; tld++) {
		httpDomain[tld] = getXMLHTTPRequest();
		searchDomain(domain);

	}
}
function searchDomain(consult) {
	try {
		httpDomain[tld].open("GET", "search.php?domain=" + consult + "&tld=" + tld, true);
		httpDomain[tld].onreadystatechange = traceDomain;
		httpDomain[tld].send(null);
	}
	catch(e){ alert('Servidor en mantenimiento, intentelo mas tarde.'); }
	finally {}
	if ($("div#domain_roll").is(":hidden")) { $("div#domain_roll").show("slow"); }
}
Sabeis por que no funciona el httpDomain[tld]? No se puede hacer mediante un Array(); ?

Se que una solución rápida y chapucera es hacer algo tipo:

httpDomain1 = getXMLHTTPRequest();
httpDomain2 = getXMLHTTPRequest();
httpDomain3 = getXMLHTTPRequest();
httpDomain4 = getXMLHTTPRequest();
httpDomain5 = getXMLHTTPRequest();

etc... y lo mismo con el tracePage y demás pero como veréis eso es una chapuza catedrática, imagínate que tengo que hacer algún día una petición de 500 Arrays con 500 datos en cada Array, eso es mucho código desperdiciado.

Bueno tengo que irme amigos, muchas gracias por vuestra ayuda y espero que sirva para alguno lo que puse arriba, me sentiría mejor persona

Última edición por anf; 06/07/2009 a las 17:01 Razón: Cambio de título.