Ver Mensaje Individual
  #1 (permalink)  
Antiguo 23/03/2011, 12:23
Avatar de ghidalgoram
ghidalgoram
 
Fecha de Ingreso: marzo-2008
Ubicación: Costa Rica
Mensajes: 446
Antigüedad: 16 años, 2 meses
Puntos: 7
Pregunta Variable no se actualiza con "responseText"

Hola amigos. Tengo un problema que desde hace mucho no he podido resolver.
Agradezco su ayuda. Les presento el código. Es una función en Javascript, la cuál se llama "send_form_data()". Esta función se encarga de validar un formulario(revisar campos vacíos, formatos de correos,etc). Si son correctos los campos del formulario, se envia mediante AJAX. Todo hasta aquí bien.

Se me había ocurrido investigar sobre el Recaptcha y puede comprender que se puede usar este sistema de seguridad con diferentes tecnologías (PHP, AJAX,etc, etc).

Decidí incluir un Recaptcha, pero como yo quería mantener la forma de procesar el Formulario (usando AJAX), pensé adaptar el Recaptcha con AJAX. Una idea de como está estructurada la función "send_form_data()"

1. Primero, si el campo del Recaptcha está vacio, debe validar lo que se digitó en el campo del Recaptcha. Por medio de AJAX, verifica el resultado del Recaptcha con un archivo que está en el servidor, llamado "recaptcha.php". Este devuelve el resultado en una variable global llamada "respuesta". Eso es todo lo que debería hacer, cuando se verifica el Recaptcha.

La variable "respuesta" la inicializo con un valor de vacio. Cuando se ejecuta el siguiente código:



ajaxobj_recaptcha.open('POST',url_proc_form,true);
ajaxobj_recaptcha.onreadystatechange=function() {

if(ajaxobj_recaptcha.readyState==4 && ajaxobj_recaptcha.status==200)
{


//En esta sección es donde necesito que se asigne el resultado del archivo 'recaptcha.php', pero no sé por qué no lo hace . Deseo una sugerencia que hacer para que el programa

// no continue con la 2° parte HASTA QUE SE ASIGNE ESE VALOR. Como pueden ver, al inicio de la función "send_form_data()" la variable 'respuesta' es inicializada como vacio.


respuesta = ajaxobj_recaptcha.responseText;
// Respuesta del Recaptcha (archivo 'recaptcha.php')
}
}

ajaxobj_recaptcha.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
ajaxobj_recaptcha.send(param);

//Empiezo a validar cada campo del Form (que no estén vacios).

alert(respuesta); // Hago un "alert()" para ver el resultado, pero me devuelve un valor vacio, no se por qué





Más abajo de este código, utilizo la variable 'respuesta' y pregunto si es igual a la frase "mal-escrito"


Código Javascript:
Ver original
  1. if(respuesta=='mal-escrito')
  2.     {
  3.         document.getElementById('recaptcha_response_field').focus();
  4.         document.getElementById('img_error8').className='img_visible';
  5.         error_form_field[0]="<br />El campo 'Captcha' no coincide con el valor de la imagen. Por favor digíte los números y letras que aparecen en la imagen.";
  6.         respuesta="";
  7.         Recaptcha.reload();
  8.     }





2. Validar los demás campos del form y si todo esta bien se envia el formulario e indica un mensaje de que el formulario se envio sin ningún problema.


Aqui les inserto la función dividida en dos partes:



Código Javascript:
Ver original
  1. function send_form_data()
  2. {
  3. // ******* 1° Parte  *********
  4.     var error_form_field = new Array();
  5.     respuesta = ""; // variable que define si el Recaptcha fué digitado correctamente
  6.  
  7.  
  8.     /* verifica si el Recaptcha es correcto ó está mal escrito*/
  9.     var READY_STATE_UNINITIALIZED=0;
  10.     var READY_STATE_LOADING=1;
  11.     var READY_STATE_LOADED=2;
  12.     var READY_STATE_INTERACTIVE=3;
  13.     var READY_STATE_COMPLETE=4;
  14.     var ajaxobj_recaptcha = createObject();
  15.    
  16.         var procruta_recaptcha="folder/recaptcha.php"; //Archivo dado por Google
  17.  
  18.         resp_captcha=Recaptcha.get_challenge();
  19.         nocache = Math.random(); // Set te random number to add to URL request
  20.  
  21.         // Paso var con POST
  22.         var param = "recaptcha_challenge_field="+Recaptcha.get_challenge()+"&recaptcha_response_field="+Recaptcha.get_response()+"&resp_captcha="+resp_captcha;
  23.         var url_proc_form = procruta_recaptcha+'?nocache='+nocache;
  24.  
  25.         ajaxobj_recaptcha.open('POST',url_proc_form,true);
  26.         ajaxobj_recaptcha.onreadystatechange=function() {
  27.             if(ajaxobj_recaptcha.readyState==4 && ajaxobj_recaptcha.status==200)
  28.             {
  29.                 //En esta sección es donde necesito que se asigne el resultado del archivo 'recaptcha.php', pero no sé por qué no lo hace :-( . Deseo una sugerencia que hacer para que el programa
  30.                 // no continue con la 2° parte HASTA QUE SE ASIGNE ESE VALOR. Como pueden ver, al inicio de la función "send_form_data()" la variable 'respuesta' es inicializada como vacio.
  31.                 respuesta = ajaxobj_recaptcha.responseText;// Respuesta del Recaptcha (archivo 'recaptcha.php')
  32.             }
  33.         }
  34.  
  35.         ajaxobj_recaptcha.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
  36.         ajaxobj_recaptcha.send(param);// Con POST paso variables y con GET pongo NULL
  37.     //Empiezo a validar cada campo del Form (que no estén vacios).
  38.    
  39.     alert(respuesta); // Hago un "alert()" para ver el resultado, pero me devuelve un valor vacio, no se por qué :-(
  40.  
  41.  
  42.  
  43.  
  44.  
  45. // ******* 2° Parte  *********
  46.  
  47.  
  48. //A PARTIR DE AQUI EN ADELANTE EMPIEZO A VALIDAR TODOS LOS CAMPOS DEL FORMULARIO (como se hace con cualquier formulario). No los pongo todos. Eliminé unos cuantos.
  49. // Yo deseo que en la variable "respuesta" tenga la respuesta si el Recaptcha fué digitado correctamente. Si fué mal digitado, el archivo 'recaptcha.php' debería retornar un valor como "mal-escrito" y asignarlo en una variable Global de Javascript llamada 'respuesta'. Esta variable('respuesta') me indica que el recaptcha fué mal digitado, y no permite que se envie el formulario con AJAX, hasta que se digite correctamente.
  50.    
  51.     if(document.getElementById('txt_nombre').value == "")
  52.     {
  53.         document.getElementById('txt_nombre').focus();
  54.         document.getElementById('img_error1').className='img_visible';
  55.         error_form_field[0]="<br />El campo 'Nombre' est&aacute; vac&iacute;o.";
  56.     }
  57.     else
  58.     if(document.getElementById('recaptcha_response_field').value == "")
  59.     {
  60.         document.getElementById('recaptcha_response_field').focus();
  61.         document.getElementById('img_error8').className='img_visible';
  62.         error_form_field[0]="<br />El campo 'Captcha' est&aacute; vac&iacute;o. Por favor digíte los números y letras que aparecen en la imagen.";
  63.         respuesta="";
  64.         Recaptcha.reload();
  65.     }
  66.     else
  67.     if(respuesta=='mal-escrito') // No se ejecuta, porque el valor va vacio. No se asigna el resultado del Recaptcha a la variable 'respuesta'. Se mantiene con el valor vacio.
  68.     {
  69.         document.getElementById('recaptcha_response_field').focus();
  70.         document.getElementById('img_error8').className='img_visible';
  71.         error_form_field[0]="<br />El campo 'Captcha' no coincide con el valor de la imagen. Por favor digíte los números y letras que aparecen en la imagen.";
  72.         respuesta="";
  73.         Recaptcha.reload();
  74.     }
  75.     else
  76.     {
  77.         //ENVIAR FORMULARIO CON AJAX
  78.         var txt_nombre = encodeURI(document.getElementById('txt_nombre').value);
  79.        
  80.         nocache = Math.random();// Set te random number to add to URL request
  81.         // Paso var con POST
  82.         var param = 'txt_nombre='+txt_nombre+'&txt_campo2='+txt_campo2;
  83.        
  84.         var url_proc_form = "procs/"+procruta+'?nocache='+nocache;
  85.         ajaxobj.open('POST',url_proc_form,true);
  86.         ajaxobj.onreadystatechange=procesando_datos_msje;
  87.         ajaxobj.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
  88.         ajaxobj.send(param);// Con POST paso variables y con GET pongo NULL
  89.     }
  90.  
  91.         if(error_form_field[0]!=""){
  92.         mostrar_msje_error(error_form_field); } // Muestra mensaje de error, en caso que exista.
  93.        
  94. }




Saludos
__________________
Loading...