Foros del Web » Programando para Internet » Javascript » Frameworks JS »

Problema al redireccionar a otra pagina, al finalizar llamada Ajax

Estas en el tema de Problema al redireccionar a otra pagina, al finalizar llamada Ajax en el foro de Frameworks JS en Foros del Web. Hola buenas, pues resulta que tengo un problema tonto, que no soy capaz a dar con el. resulta que tengo una funcion ajax que la ...
  #1 (permalink)  
Antiguo 09/04/2008, 15:36
 
Fecha de Ingreso: enero-2008
Mensajes: 57
Antigüedad: 16 años, 11 meses
Puntos: 0
Problema al redireccionar a otra pagina, al finalizar llamada Ajax

Hola buenas, pues resulta que tengo un problema tonto, que no soy capaz a dar con el. resulta que tengo una funcion ajax que la llamo cuando estoy actualizando una bd y que deberia finalizar cuando elimino un fichero desde otra aplicacion c++. El codigo de la funcion Ajax es el siguiente:

Código PHP:
function aj(){
    if(
window.XMLHttpRequest){
        return new 
XMLHttpRequest();
    }
    else{
        try{
            return new 
ActiveXObject('Microsoft.XMLHTTP');
        }catch(
e){
            
alert('tu navegador no soporta ajax');
            return 
false;
        }
    }
}


function 
actualiza(url){
   var 
rpc2=aj();
    if(
rpc2){
        
rpc2.open('GET',url,true);
        
rpc2.onreadystatechange=function(){
            if(
rpc2.readyState==4){
                
actualizo=rpc2.responseText;
            }
        }
        
rpc2.send(null);
    }
}

var 
actualizo;

function 
Rellenar_Bd(url){

  
window.document.getElementById('contenedor').style.height="650px";
  
window.document.getElementById('loading_tablas').style.display='inline';
  
  
window.onload=function(){
     var 
pp=setInterval(function(){
      if(
actualizo==1){
          
window.document.getElementById     ('loading_tablas').style.display='none';
          
document.location.href='index.php?seccion=2&act=3';
      };
   
actualiza(url+'&'+Math.random());
  },
700);
 }

Como podeis ver esta ultima funcion Rellenar_bd, hace una peticion ajax cada 700msg, a la siguiente pagina

Código PHP:
if(file_exists("tmp/status.log"))
    echo 
"0";
else
    echo 
"1"
que lo unico que hace es mirar a ver si existe el fichero status.log y devolver 0 o 1.
El problema viene que cuando deja de existir actualiza=1, y en teoria se tendria que cumplir la condicion de la funcion Rellena_Bd y redireccionarme a la sgt pagina ( document.location.href='index.php?seccion=2&act=3' ;). y lo que ocurre es que en firefox funciona, pero en explorer, cuando actualiza=1 se ejecuta
(window.document.getElementById ('loading_tablas').style.display='none'), pero se queda pillado como cargando cada medio segundo o por ahi, otra pagina, pero que no acaba de cargarla.

Espero que alguien me pueda ayudar, ya que no soy capaz a dar con ello.

Saludos y Gracias
  #2 (permalink)  
Antiguo 09/04/2008, 16:42
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 6 meses
Puntos: 2135
Re: Problema al redireccionar a otra pagina, al finalizar llamada Ajax

Prueba usar window.location = "url", en lugar de document.location.href.

Saludos.
  #3 (permalink)  
Antiguo 09/04/2008, 16:47
 
Fecha de Ingreso: enero-2008
Mensajes: 57
Antigüedad: 16 años, 11 meses
Puntos: 0
Re: Problema al redireccionar a otra pagina, al finalizar llamada Ajax

joer Gator_V, eres un crack, funciono a la primera

Muchisimas Gracias de verdad

Saludos
  #4 (permalink)  
Antiguo 10/04/2008, 14:25
 
Fecha de Ingreso: enero-2008
Mensajes: 57
Antigüedad: 16 años, 11 meses
Puntos: 0
Re: Problema al redireccionar a otra pagina, al finalizar llamada Ajax

Bueno, esto es rarisimo, probe a poner window.location = 'url' y me ha funcionado perfectamente hoy todo el dia, pero hace unos minutos probe, y vuelta a la misma.
Cuando se borra el fichero status.log se devuelve un 1 y me esconde el div ('loading_tablas'), pero no me redirecciona bien a la siguiente pagina, sino que se queda como pillado, todo el rato como refrescando pero sin lleguar a la siguiente pagina. He mirado en firefox con el firebug, y resulta que cuando se borra el fichero, el response devuelve un 1, pero sigue haciendo otra vez la peticion Ajax cada 700msg, y no me redirecciona a la siguiente pagina.

¿Qué estaré haciendo mal? Estoy volviendome loco con esto.

Saludos
  #5 (permalink)  
Antiguo 10/04/2008, 14:37
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 6 meses
Puntos: 2135
Re: Problema al redireccionar a otra pagina, al finalizar llamada Ajax

Prueba agregar un return; después del window.location.

Saludos.
  #6 (permalink)  
Antiguo 10/04/2008, 14:43
 
Fecha de Ingreso: enero-2008
Mensajes: 57
Antigüedad: 16 años, 11 meses
Puntos: 0
Re: Problema al redireccionar a otra pagina, al finalizar llamada Ajax

Joer, muchas gracias por responder tan rapido, casi parece un chat.
Acabo de probar y nada, sigue como pillado el navegador refrescando, pero ocultar el div ('Loading_Tablas') si lo oculta, por eso me parece muy extraño, ya que entrar en el if por lo menos entra. Solo son ese codigo que te puse al principio, y tampoco es muy complicado. Fijo que es una pijada pero no soy capaz de dar con ello.

Muchas Gracias por responder

Saludos
  #7 (permalink)  
Antiguo 10/04/2008, 15:24
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 6 meses
Puntos: 2135
Re: Problema al redireccionar a otra pagina, al finalizar llamada Ajax

Mmm prueba esto:
Código:
function aj(){
	if(window.XMLHttpRequest){
		return new XMLHttpRequest();
	} else {
		try{
			return new ActiveXObject('Microsoft.XMLHTTP');
		}catch(e){
			alert('tu navegador no soporta ajax');
			return false;
		}
	}
}

function navAway() {
	document.getElementById('loading_tablas').style.display='none';
	window.location = 'index.php?seccion=2&act=3';
}

function Rellenar_Bd( url ) {
	document.getElementById('contenedor').style.height="650px";
	document.getElementById('loading_tablas').style.display='inline';
	
	var theURL = url + "&" + Math.random();
	Runner.run( theURL, navAway, 700 );
}

var Runner = function(){
	var timer;
	var f = function(url, cb){
		return function(){
			var rpc2=aj();
			if( rpc2 ) {
				rpc2.open('GET',url,true);
				rpc2.onreadystatechange=function(){
					if( rpc2.readyState == 4 ) {
						var actualizo = rpc2.responseText;
						if( actualizo == 1 ) {
							window.clearInterval(timer);
							cb();
						}
					}
				};
			}
	
			rpc2.send(null);
		};
	};
	return {
		run : function(url, cb, ms) {
			timer = window.setInterval(f(url, cb), ms);
		}
    }
}();
No lo he probado, pero creo debería de funcionar.
  #8 (permalink)  
Antiguo 10/04/2008, 15:58
 
Fecha de Ingreso: enero-2008
Mensajes: 57
Antigüedad: 16 años, 11 meses
Puntos: 0
Re: Problema al redireccionar a otra pagina, al finalizar llamada Ajax

GatorV muchas gracias de verdad. Acabo de probar el codigo que me pusistes y te cuento. en firefox funciona a la perfeccion, pero en explorer queda el div loading_bd funcionando, no llega a ocultarse y tampoco me redirecciona a la siguiente pagina. Lo que si es cierto es que si le doy a refrescar me redirreciona a la nueva pagina y me oculta el div, y no queda pillado refrescando como con el codigo que tenia yo antes.

Joer, la verdad es que es muy raro, deberia funcionar.

Un Saludo y gracias de verdad
  #9 (permalink)  
Antiguo 10/04/2008, 16:50
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 6 meses
Puntos: 2135
Re: Problema al redireccionar a otra pagina, al finalizar llamada Ajax

Prueba usando prototype, esto:
Código:
Ajax.PeriodicalAjax = Class.create(Ajax.Base, {
  initialize: function($super, url, options) {
    $super(options);
    this.onComplete = this.options.onComplete;

    this.frequency = (this.options.frequency || 2);
    this.decay = (this.options.decay || 1);

    this.updater = { };
    this.url = url;

    this.start();
  },

  start: function() {
    this.options.onComplete = this.updateComplete.bind(this);
    this.onTimerEvent();
  },

  stop: function() {
    this.updater.options.onComplete = undefined;
    clearTimeout(this.timer);
    (this.onComplete || Prototype.emptyFunction).apply(this, arguments);
  },

  updateComplete: function(response) {
    if (this.options.decay) {
      this.decay = (response.responseText == this.lastText ?
        this.decay * this.options.decay : 1);

      this.lastText = response.responseText;
    }
    this.timer = this.onTimerEvent.bind(this).delay(this.decay * this.frequency);
  },

  onTimerEvent: function() {
    this.updater = new Ajax.Request(this.url, this.options);
  }
});

function Rellenar_Bd( url ) {
	var theURL = url + "&" + Math.random();
	
	$('contenedor').style.height="650px";
	Element.show('contenedor');
	
	new Ajax.PeriodicalAjax(theURL, {
		method: 'get', 
		frequency: 0.7,
		decay: 1,
		onSuccess: function(res) {
			if( res.responseText == "1" ) {
				Element.hide('loading_tablas');
				window.location = 'index.php?seccion=2&act=3';
			}
		}
	});
}
Saludos.
  #10 (permalink)  
Antiguo 11/04/2008, 03:31
 
Fecha de Ingreso: enero-2008
Mensajes: 57
Antigüedad: 16 años, 11 meses
Puntos: 0
Re: Problema al redireccionar a otra pagina, al finalizar llamada Ajax

Hola GatorV he probado esto ultimo que me pusistes y bueno, esto debe ser cosa de brujas, resulta que en firefox funciona perfectamente, con el firebug se ve como hace las peticiones cada 700msg, y cuando se borra el fichero status.log redirecciona correctamente.
Pero en explorer cuando se borra el fichero status.log no redirecciona, y ademas tampoco se esponde el elemente 'loading_tablas' lo raro es que alguna vez si ha funcionado, pero la mayoria de veces no. Ha, si cuando se ha borrado el fichero status.log, refresco el navegador si me redirecciona y me esconde el loading_tablas.

Esto ya no es normal, no tengo ni idea que puede estar pasando, ¿Puede ser cosa del explorer 7 o algo?

Saludos
  #11 (permalink)  
Antiguo 11/04/2008, 04:55
Avatar de mgusdl  
Fecha de Ingreso: abril-2007
Ubicación: Malaga, España
Mensajes: 190
Antigüedad: 17 años, 7 meses
Puntos: 5
Re: Problema al redireccionar a otra pagina, al finalizar llamada Ajax

consigna una pregunta
El fichero tmp/status.log es muy pesado? Es que quizás acabas antes si con JS llamas directamente al fichero. En caso de error al llamarlo sabrás si existe o no.

MSIE da más de un dolor de cabeza a la hora de trabajar con AJAX, cawendió.
  #12 (permalink)  
Antiguo 11/04/2008, 08:28
 
Fecha de Ingreso: enero-2008
Mensajes: 57
Antigüedad: 16 años, 11 meses
Puntos: 0
Re: Problema al redireccionar a otra pagina, al finalizar llamada Ajax

que va, si solo tiene dos lineas de texto, una donde indico la cantidad de linas que lleva procesadas y otra donde indico el porcentaje que lleva procesado la aplicacion c++ sobre unos 12 bytes,
Ha se me olvidaba, el fichero status.log estaria en el servidor

Última edición por consigna; 11/04/2008 a las 08:39
  #13 (permalink)  
Antiguo 11/04/2008, 10:32
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 6 meses
Puntos: 2135
Re: Problema al redireccionar a otra pagina, al finalizar llamada Ajax

Hola consigna,

Puedes bajar una herramienta como esta: http://www.ieinspector.com/dominspector/index.html y monitorear porque esta fallando (es como el firebug para ie).

Saludos.
  #14 (permalink)  
Antiguo 11/04/2008, 10:34
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 6 meses
Puntos: 2135
Re: Problema al redireccionar a otra pagina, al finalizar llamada Ajax

Como adicional, puedes probar esto (usando el código de arriba):
Código:
function Rellenar_Bd( url ) {
	var theURL = url + "&" + Math.random();
	
	$('contenedor').style.height="650px";
	Element.show('contenedor');
	
	new Ajax.PeriodicalAjax(theURL, {
		method: 'get', 
		frequency: 0.7,
		decay: 1,
		onSuccess: function(res) {
			if( res.responseText == "1" ) {
				this.stop();
                                setTimeout( function() {
                                          Element.hide('loading_tablas');
				          window.location = 'index.php?seccion=2&act=3';
                                }, 1000 );
			}
		}
	});
}
Saludos.
  #15 (permalink)  
Antiguo 11/04/2008, 15:47
 
Fecha de Ingreso: enero-2008
Mensajes: 57
Antigüedad: 16 años, 11 meses
Puntos: 0
Re: Problema al redireccionar a otra pagina, al finalizar llamada Ajax

Muchas gracias GatorV, y por la aplicacion, muy util por cierto, lastima que sea trial.

Pues te cuento, con tu codigo, la peticion ajax la hace a 'procesando.php&act=2 + Math_Ramdon()' que es la pagina donde comprueba si sigue existiendo o no el fichero status.log, pero lo que veo con el ie WebDeveloper es que en las peticiones HTTP, todas se realizan con el mismo numero aleatorio generado por Math_Random(), y pone que se han sido resultado del cache. te pongo una captura para que lo veas. Ademas da un error que no se de que puede ser.





Saludos y muchas gracias, a ver si damos con el problema
  #16 (permalink)  
Antiguo 13/04/2008, 14:48
 
Fecha de Ingreso: enero-2008
Mensajes: 57
Antigüedad: 16 años, 11 meses
Puntos: 0
Re: Problema al redireccionar a otra pagina, al finalizar llamada Ajax

No os da alguna pista de donde puede estar el problema?
  #17 (permalink)  
Antiguo 14/04/2008, 08:06
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 6 meses
Puntos: 2135
Re: Problema al redireccionar a otra pagina, al finalizar llamada Ajax

Mmmm es raro, al parecer con cada llamada ocupa la pasada y no crea un nuevo número aleatorio, a ver prueba esto:
Código:
Ajax.PeriodicalAjax = Class.create(Ajax.Base, {
  initialize: function($super, url, options) {
    $super(options);
    this.onComplete = this.options.onComplete;

    this.frequency = (this.options.frequency || 2);
    this.decay = (this.options.decay || 1);

    this.updater = { };
    this.url = url;

    this.start();
  },

  start: function() {
    this.options.onComplete = this.updateComplete.bind(this);
    this.onTimerEvent();
  },

  stop: function() {
    this.updater.options.onComplete = undefined;
    clearTimeout(this.timer);
    (this.onComplete || Prototype.emptyFunction).apply(this, arguments);
  },

  updateComplete: function(response) {
    if (this.options.decay) {
      this.decay = (response.responseText == this.lastText ?
        this.decay * this.options.decay : 1);

      this.lastText = response.responseText;
    }
    this.timer = this.onTimerEvent.bind(this).delay(this.decay * this.frequency);
  },

  onTimerEvent: function() {
    var pars = ( this.options.parameters || {} );
    pars['__r'] = Math.random();
    this.options.parameters = pars;
    this.updater = new Ajax.Request(this.url, this.options);
  }
});

function Rellenar_Bd( url ) {
	$('contenedor').style.height="650px";
	Element.show('contenedor');
	
	new Ajax.PeriodicalAjax(url, {
		method: 'get', 
		frequency: 0.7,
		decay: 1,
		onSuccess: function(res) {
			if( res.responseText == "1" ) {
				this.stop();
                                setTimeout( function() {
                                          Element.hide('loading_tablas');
				          window.location = 'index.php?seccion=2&act=3';
                                }, 1000 );
			}
		}
	});
}
Saludos.
  #18 (permalink)  
Antiguo 14/04/2008, 09:48
 
Fecha de Ingreso: enero-2008
Mensajes: 57
Antigüedad: 16 años, 11 meses
Puntos: 0
Re: Problema al redireccionar a otra pagina, al finalizar llamada Ajax

Muchas gracias de nuevo GatorV por ayudarme a solucionar este problema.

He puesto el nuevo codigo que me has pasado y ahora si hace cada peticion ajax, con un numero aleatorio distinto, y puedo ver que ahora no tira de la cache.

Pero no redirecciona a la siguiente pagina cuando se borra el fichero status, es como si no cogiera bien el 1 que le paso cuando se acaba de borrar el fichero.
Ademas tampoco esconde el div loading_tablas. He mirado con el firebug en mozilla y las peticiones ajax, responden bien con 1 ó 0 si esta borrado o no el fichero status. Ya no se que puede estar pasando, es rarisimo.

Saludos
  #19 (permalink)  
Antiguo 14/04/2008, 10:07
 
Fecha de Ingreso: abril-2008
Ubicación: Argentina
Mensajes: 75
Antigüedad: 16 años, 8 meses
Puntos: 0
Re: Problema al redireccionar a otra pagina, al finalizar llamada Ajax

Estoy leyendo el pos pero me he mareado con tanto código, pero tengo una idea que puede ayudar:

Código:
var id = setInterval(...);
//Se cumple la condición
clearInterval(id);
location.href = "url"
//Espero que sea de utilidad


********************
www.JoMiCo.com.ar
********************
  #20 (permalink)  
Antiguo 14/04/2008, 12:12
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 6 meses
Puntos: 2135
Re: Problema al redireccionar a otra pagina, al finalizar llamada Ajax

A ver probemos esto:
Código:
function Rellenar_Bd( url ) {
	$('contenedor').style.height="650px";
	Element.show('contenedor');
	
	new Ajax.PeriodicalAjax(url, {
		method: 'get', 
		frequency: 0.7,
		decay: 1,
		onSuccess: function(res) {
                        var respuesta = parseInt(res.responseText);
			if( respuesta == 1 ) {
				this.stop();
                                setTimeout( function() {
                                          Element.hide('loading_tablas');
				          window.location = 'index.php?seccion=2&act=3';
                                }, 1000 );
			}
		}
	});
}
En tu archivo remoto (el que regresa 0 o 1) asegúrate que regrese el resultado como text/plain.

Saludos.
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 02:51.