Foros del Web » Programando para Internet » Javascript »

ajax.onreadystatechange=fuction() dentro de otro ajax.onreadystatechange=fuction()

Estas en el tema de ajax.onreadystatechange=fuction() dentro de otro ajax.onreadystatechange=fuction() en el foro de Javascript en Foros del Web. Que tal forer@s tengo un problemilla y no se como darle solucion, veran, tengo una funcion ajax que valida los campos de un formulario (nombre, ...
  #1 (permalink)  
Antiguo 26/01/2012, 12:33
Avatar de catpaw  
Fecha de Ingreso: mayo-2010
Ubicación: xalapa
Mensajes: 856
Antigüedad: 14 años
Puntos: 23
ajax.onreadystatechange=fuction() dentro de otro ajax.onreadystatechange=fuction()

Que tal forer@s

tengo un problemilla y no se como darle solucion, veran, tengo una funcion ajax que valida los campos de un formulario (nombre, correo, fecha, descripcion, captcha) para validar los primeros lo hago del lado del cliente sin problema,

pero para validar el captcha declaro una variable

ajax = ajaxfunction() (funcion hecha previamente)

y pido un archivo php mediante el

ajax.open("GET","ruta/verifica_captcha.php")

y tomo la respuesta devuelta por medio de

ajax.onreadystatechange=function(){
que pregunta si es correcto o no
}

Hasta aqui todo bien, el problema viene si es correcto el captcha y todo lo demas ya que necesito abrir otra

ajax=function()
ajax.open("GET","ruta/insertar_bd.php")

para enviar ahora todos los valores al archivo php que los insertara a la base de datos, tambien tendra que llevar un

ajax.onreadystatechange=function(){
que pregunta si se ingreso todo correcto a la bd y muestre el mensaje de que todo salio bien
}

no me funciona el codigo que tengo y es que no creo que sea correcto meter una funcion dentro de la otra pero no se entonces como se puede resolver esto, aca dejo el esquema del codigo que tengo hasta el momento:

Código PHP:
function procesar_comentario(){
        
    
//recibo variables
    
var nombredocument.getElementById('nombre').value;
    
//las demas variables

    //empiezan validaciones
    
if (nombre==""){
        
alert ("campo obligatorio");
    }
    else{
        
//las demas validaciones    
                
if(){
                }
                else{ 
//aqui llega la validacion del captcha donde hare la peticion al php
                        
var ajax_verify_captcha//declaro la variable
                        
ajax_verify_captchaajaxFunction(); //le asigno la funcion hecha previamente
                       
ajax_verify_captcha.open("GET""ruta/verificar_captcha.php?variable1="+variable1+"&variable2="+variable2true);  //aqui ya pido el archivo y le mando las variables que se van a verificar
                       
ajax_verify_captcha.setRequestHeader("Content-Type""application/x-www-form-urlencoded");
                       
ajax_verify_captcha.onreadystatechange = function() { // funcion que entre otras cosas devuelve la respuesta del php
                      
var resp_verify_captha ajax_verify_captcha.responseText//asigno a una variable la respuesta del php
        
        
if (ajax_verify_captcha.readyState==4){
                       if(
resp_verify_captha=="incorrecto"){ //pregunto si esta mal
                
alert("error captcha"); //mensaje de error
                
Recaptcha.reload(); //que se recargue el captcha
        
}
        else{
            if(
resp_verify_captha=="correcto"){ //aqui viene lo que no se cmo hacer, si el captcha fue correcto
                    
alert('1');                                                                
                           var 
ajax_insert_opinion//declaro otra variable que 
                
ajax_insert_opinionajaxFunction(); //guarda la funcion hecha previamente
                
alert('2');     //hasta aca corre el codigo, los siguientes alert ya no los imprime
                                
ajax_insert_opinion.open("GET""../insertar_bd.php?variables="+variablestrue);
                                
alert('3');
                                
ajax_insert_opinion.setRequestHeader("Content-Type""application/x-www-form-urlencoded");
                                
alert('4');
                                
ajax_insert_opinion.onreadystatechange = function() {
                
alert('5');
                if (
ajax_insert_opinion.readyState == 1){
                  
alert('6');
                                  
document.getElementById('capa_respuesta').style.display='';
                                  
document.getElementById('capa_respuesta').innerHTML"Procesando";
                                  
alert('7');
                                }
                                if (
ajax_insert_opinion.readyState == 4){
                                   
alert('8');
                                   
document.getElementById('capa_respuesta').innerHTMLajax_insert_opinion.responseText;
                                   
alert('9');
                                }
                            }
                            
ajax_insert_opinion.send(null);
                      }
                }
         }
    
ajax_verify_captcha.send(null);

Si alguien sabe como puedo hacer que funcione con esta estructura seria lo mejor, o si alguien propone otro metodo tambien se lo agradecere.

Gracias
  #2 (permalink)  
Antiguo 26/01/2012, 13:06
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 15 años, 9 meses
Puntos: 1532
Respuesta: ajax.onreadystatechange=fuction() dentro de otro ajax.onreadystatechange=f

en determinadas oraciones y post diferentes he dicho, y mantengo lo que digo: es completamente inútil validar un captcha por AJAX, un captcha debe validarse, sí o sí en el mismo envío y manipulación de datos, no enviar los datos otra vez (doble request).
__________________
¡Por favor!: usa el highlight para mostrar código
El que busca, encuentra...
  #3 (permalink)  
Antiguo 26/01/2012, 13:16
Avatar de catpaw  
Fecha de Ingreso: mayo-2010
Ubicación: xalapa
Mensajes: 856
Antigüedad: 14 años
Puntos: 23
Respuesta: ajax.onreadystatechange=fuction() dentro de otro ajax.onreadystatechange=f

Hola maycolalvarez, gracias por tu pronta respuesta,

tienes la razón en lo que me comentas, pero veraz si el envió del formulario lo hago por ajax, e incluso ni uso etiquetas form, de que modo se puede validar el captcha del lado del servidor?

Y es que lo que quiero evitar es que el usuario envié su comentario y demás datos y que se cambie o recargue la pagina para que estos se validen/inserten en la bd y menos aun que si hubo algun error tenga que volver al formulario y capturar todo de nuevo.

lo que me interesa es evitar todo ese rollo por eso obte por ajax (que con la funcion que implementé permite al usuario ir conociendo sus errores al mismo tiempo que va capturando, para comodidad de el). de todos modos del lado del servidor si habrá validaciones por seguridad, pero ya seria en el caso extremo que las validaciones del lado del cliente no se hayan hecho correctamente.

Concretamente con mi duda, es posible lo que intento hacer? si, que debo corregir? no, hay alguna otra opción?

Gracias
  #4 (permalink)  
Antiguo 26/01/2012, 14:01
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 15 años, 9 meses
Puntos: 1532
Respuesta: ajax.onreadystatechange=fuction() dentro de otro ajax.onreadystatechange=f

al contrario, si estás usando AJAX para enviar el form, hazlo todo en una sóla petición AJAX, no una detrás de otra como planeas, la falla es validar el captcha en una petición y enviar la data por otra, debes enviarla toda (form + captcha) al mismo tiempo por ajax.

como usas AJAX no te preocupas de recargar el formulario, sólo debes de tener en cuenta que al validar el captcha si es fallido, devolverlo como respuesta y mandar a recargar el captha, luego de que el user lo "acomode" enviar todo de nuevo y en caso de éxito, ocultar el form o lo que quieras.

es un poco pesado para el server, lo sé, pero es la única forma de verificar si es seguro que un "humano" está posteando, si lo quieres optimizar, valida primero el captcha antes que todo en el servidor, al menos si el mismo falla le ahorras de validar "data sospechosa".

Por cierto en el AJAX te falta verificar status == 200, no solo debes evaluar el readyState == 4, saludos
__________________
¡Por favor!: usa el highlight para mostrar código
El que busca, encuentra...
  #5 (permalink)  
Antiguo 26/01/2012, 14:18
Avatar de catpaw  
Fecha de Ingreso: mayo-2010
Ubicación: xalapa
Mensajes: 856
Antigüedad: 14 años
Puntos: 23
Respuesta: ajax.onreadystatechange=fuction() dentro de otro ajax.onreadystatechange=f

ok si si!

hago solo una peticion al php y mando todo los datos, en el php la estructura quedaria:

Código PHP:

//recibo variables del captcha

si(!variables_captcha->is_valid){
  echo 
"incorrecto";
}
else{
   
//recibo las demas variables

   //valido

   //inserto ala bd

entonces en la funcion ajax

pregunto
si (respuesta=="incorrecto")
recargo el capcha
si no
alert("todo salio bien");

ok voy a probar esto y te cuento gracias :D
  #6 (permalink)  
Antiguo 27/01/2012, 08:37
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 15 años, 9 meses
Puntos: 1532
Respuesta: ajax.onreadystatechange=fuction() dentro de otro ajax.onreadystatechange=f

recuerda que aveces desde php se envían caracteres invisibles, por lo que la comprobación en js falla, puedes aplicar un exit; después del echo
__________________
¡Por favor!: usa el highlight para mostrar código
El que busca, encuentra...
  #7 (permalink)  
Antiguo 27/01/2012, 11:59
Avatar de catpaw  
Fecha de Ingreso: mayo-2010
Ubicación: xalapa
Mensajes: 856
Antigüedad: 14 años
Puntos: 23
Respuesta: ajax.onreadystatechange=fuction() dentro de otro ajax.onreadystatechange=f

ok muchas gracias lo agregare quedaría algo así no?

echo "incorrecto";
exit();

por otro lado, ya agregue la condicion status == 200 y ya probé la estructura que puse y va bien, me estaba complicando de más.

Saludos!!
  #8 (permalink)  
Antiguo 27/01/2012, 13:38
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 15 años, 9 meses
Puntos: 1532
Respuesta: ajax.onreadystatechange=fuction() dentro de otro ajax.onreadystatechange=f

sí, excelente que lo hayas conseguido, +karma por tu esfuerzo, saludos
__________________
¡Por favor!: usa el highlight para mostrar código
El que busca, encuentra...
  #9 (permalink)  
Antiguo 27/01/2012, 14:55
Avatar de catpaw  
Fecha de Ingreso: mayo-2010
Ubicación: xalapa
Mensajes: 856
Antigüedad: 14 años
Puntos: 23
Respuesta: ajax.onreadystatechange=fuction() dentro de otro ajax.onreadystatechange=f

wow muchas gracias por la ayuda y por el karma!!! :D

sin el tip del exit() no me habría salido en firefox ya que se quedaba en el readyState == 1

Saludos!

Etiquetas: ajax, formulario, funcion, html, 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 22:43.