Foros del Web » Programando para Internet » Javascript »

Problema con AJAX

Estas en el tema de Problema con AJAX en el foro de Javascript en Foros del Web. Buenas a todos, es mi primer post en el foro así que si me equivoco en algo me lo comentáis y lo corregiré con gusto. ...
  #1 (permalink)  
Antiguo 06/06/2013, 11:56
 
Fecha de Ingreso: junio-2013
Ubicación: Madrid
Mensajes: 5
Antigüedad: 10 años, 11 meses
Puntos: 0
Problema con AJAX

Buenas a todos, es mi primer post en el foro así que si me equivoco en algo me lo comentáis y lo corregiré con gusto.

Estoy haciendo una página web en la que necesito interactuar con varias páginas secundarias cargadas en mi página principal mediante AJAX.

Soy un poco novato, pero de una funciona todo, el problema es cuando tienen que funcionar las 3 al mismo tiempo.

Os comento un poco el código, el archivo .js lo he cogido de un tutorial y lo he modificado, asi que a algunos igual os suena un poco.

Son 2 partes, al principio creo el objeto y luego defino la función. Como lo tengo que usar con 2 .php en 2 divs diferentes, he probado muchas cosas, y la única que "medio funciona" es super cutre, pero no se otra xD, consiste en duplicar las 2 partes, y según el div que use una u otra.

Por qué digo "medio funciona"? Porque carga todo al tuntún en el DIV que le da la gana, pisando uno a otro etc xdd

Código:
// Suponemos que no usa IE
var isIE = false;
//	Creamos una variable para el objeto XMLHttpRequest
var req;
//	Creamos una funcion para cargar los datos en nuestro objeto.
//	Logicamente, antes tenemos que crear el objeto.
//	Vease que la sintaxis varia dependiendo de si usamos un navegador decente
//	o Internet Explorer
function cargaXML(url, div) {
	if (div=="1") {
		//	Primero vamos a ver si la URL es una URL :)
		if(url==''){
			return;
		}
		//	Usuario inteligente...
		if (window.XMLHttpRequest) {
			req = new XMLHttpRequest();
			req.onreadystatechange = processReqChange1;
			req.onload = processReqChange1;
			req.open("GET", url, true);
			req.send(null);
		//	...y usuario de Internet Explorer Windows
		} else if (window.ActiveXObject) {
			isIE = true;
			req = new ActiveXObject("Microsoft.XMLHTTP");
			if (req) {
				req.onreadystatechange = processReqChange1;
				req.onload = processReqChange1;
				req.open("GET", url, true);
				req.send();
			}
		}
	}
	if (div=="2") {
		//	Primero vamos a ver si la URL es una URL :)
		if(url==''){
			return;
		}
		//	Usuario inteligente...
		if (window.XMLHttpRequest) {
			req = new XMLHttpRequest();
			req.onreadystatechange = processReqChange2;
			req.onload = processReqChange2;
			req.open("GET", url, true);
			req.send(null);
		//	...y usuario de Internet Explorer Windows
		} else if (window.ActiveXObject) {
			isIE = true;
			req = new ActiveXObject("Microsoft.XMLHTTP");
			if (req) {
				req.onreadystatechange = processReqChange2;
				req.onload = processReqChange2;
				req.open("GET", url, true);
				req.send();
			}
		}
	}
}

//	Funcion que se llama cada vez que se dispara el evento onreadystatechange
//	del objeto XMLHttpRequest
function processReqChange1(){
	var ventana = document.getElementById("ventana");
	
	if(req.readyState == 4){
		ventana.innerHTML = req.responseText;
// ESTA LINEA SIRVE PARA BAJAR EL SCROLL AUTOMATICAMENTE
		ventana.scrollTop = ventana.scrollHeight;
	}
}

function processReqChange2(){
	var ventana = document.getElementById("contenedor");
	
	if(req.readyState == 4){
		ventana.innerHTML = req.responseText;
// ESTA LINEA SIRVE PARA BAJAR EL SCROLL AUTOMATICAMENTE
		ventana.scrollTop = ventana.scrollHeight;
	}
}

El php es este:


Código:
<!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>Battle Log</title>
		<link rel="stylesheet" href="estilos.css" type="text/css" />

			<script src="ajax.js" language="JavaScript"></script>
				<script type="text/javascript">
					docXML=cargaXML("ventana.php", "1");
					docXML=cargaXML("contenedor.php", "2");
				</script>
				<script> setInterval('cargaXML("ventana.php", "1")',3000); </script> 

       </head>

<body>
    <div id="contenedor">
		<div id="ventana">	</div>
                 <div id="contenedor"></div>
    </div>

</body>
</html>
Yo creo que se pisa una función a otra por todos los lados, pero no consigo hacerlo de otra forma, xq al llamarse del mismo modo tampoco puedo crear archivo ajax1.js y ajax2.js etc.

Alguien me puede echar un cable? GRACIAS!
  #2 (permalink)  
Antiguo 07/06/2013, 03:33
 
Fecha de Ingreso: junio-2013
Ubicación: Madrid
Mensajes: 5
Antigüedad: 10 años, 11 meses
Puntos: 0
Respuesta: Problema con Jquery AJAX

A nadie se le ocurre nada?
  #3 (permalink)  
Antiguo 07/06/2013, 04:04
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años
Puntos: 1284
Respuesta: Problema con Jquery AJAX

Hola:

En alguna ocasión tuve un problema similar que solucioné implementando una cola de peticiones Ajax, donde al recibir una respuesta se chequea el estado de la cola, y cuando hay procesos pendientes se lanzan... basta con modificar la implementación del evento readystatechange... aver si me sale "a capella"

Código:
Ajaxs = [{"url": "ventana.php", "ventana": "1"}, {"url": "contenedor.php", "ventana": "2"}];

function continuar()	{
	if (Ajaxs.length > 0)	{
		proceso = Ajaxs.shift();
		cargaXML(proceso.url, proceso.ventana);
	}
}
Y en el onreadystatechange le añades simplemente la instrucción continuar()...

Código:
if(req.readyState == 4){ continuar();
	ventana.innerHTML = req.responseText;
Dinos si te vale...

Saludos

P.D: Por cierto, no veo nada sobre jquery, así que lo borré del título.
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo

Última edición por caricatos; 07/06/2013 a las 04:07 Razón: Una posdata
  #4 (permalink)  
Antiguo 07/06/2013, 10:24
 
Fecha de Ingreso: junio-2013
Ubicación: Madrid
Mensajes: 5
Antigüedad: 10 años, 11 meses
Puntos: 0
Respuesta: Problema con AJAX

Te pongo como me ha quedado, sigue poniendo las cosas donde le da la gana :s


Ventana.php lo quiero meter dentro de div "ventana" y pet.php lo quiero meter en el div "pet".

Código:
Ajaxs = [{"url": "ventana.php", "ventana": "ventana"}, {"url": "pet.php", "ventana": "pet"}];

function continuar(){
	if(Ajaxs.length > 0){
		proceso = Ajaxs.shift();
		cargaXML(proceso.url, proceso.ventana);
	}
}

//	Vamos a presuponer que el usuario es una persona inteligente...
var isIE = false;

//	Creamos una variable para el objeto XMLHttpRequest
var req;

//	Creamos una funcion para cargar los datos en nuestro objeto.
//	Logicamente, antes tenemos que crear el objeto.
//	Vease que la sintaxis varia dependiendo de si usamos un navegador decente
//	o Internet Explorer
function cargaXML(url, div) {
	//	Primero vamos a ver si la URL es una URL :)
	if(url==''){
		return;
	}
	//	Usuario inteligente...
	if (window.XMLHttpRequest) {
		req = new XMLHttpRequest();
		req.onreadystatechange = processReqChange;
		req.onload = processReqChange;
		req.open("GET", url, true);
		req.send(null);
	//	...y usuario de Internet Explorer Windows
	} else if (window.ActiveXObject) {
		isIE = true;
		req = new ActiveXObject("Microsoft.XMLHTTP");
		if (req) {
			req.onreadystatechange = processReqChange;
			req.onload = processReqChange;
			req.open("GET", url, true);
			req.send();
		}
	}
}

//	Funcion que se llama cada vez que se dispara el evento onreadystatechange
//	del objeto XMLHttpRequest
function processReqChange(){
	var ventana = document.getElementById("ventana");

	
	if(req.readyState == 4){
		continuar();
		ventana.innerHTML = req.responseText;
// ESTA LINEA SIRVE PARA BAJAR EL SCROLL AUTOMATICAMENTE
		ventana.scroll
		Top = ventana.scrollHeight;
	}
}

Y lo llamo así desde el index.php

Código:
		<script src="ajax.js" language="JavaScript"></script>		
		<script type="text/javascript">
			docXML=cargaXML("pet.php", "pet");
			docXML=cargaXML("./chat/ventana.php", "ventana");
		</script>

		<script> setInterval('cargaXML("pet.php", "pet")', 3000); </script>
		<script> setInterval('cargaXML("./chat/ventana.php", "ventana")',3000);</script>

Ahora sale todo dentro del div ventana :s
  #5 (permalink)  
Antiguo 07/06/2013, 10:50
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años
Puntos: 1284
Respuesta: Problema con AJAX

Hola:

En principio nunca he usado el evento load de los objetos Ajax, y supongo que lo puedes eliminar... Mi código se supone que es para llamar solamente al método continuar, así que con ejecutarlo una vez con el evento que quieras es suficiente, por ejemplo cuando se cargue la página:

window.onload = continuar;

Y con los cambios que has hecho, en cargaXML tendrías que poner:

ventana = document.getElementById(div);

No tengo claro lo del scroll, deberías consultar la consola de errores de tu navegador para depurar el código.

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo

Etiquetas: ajax, funcion, html, js, php
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:13.