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

Variable no se actualiza con "responseText"

Estas en el tema de Variable no se actualiza con "responseText" en el foro de Frameworks JS en Foros del Web. 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, ...
  #1 (permalink)  
Antiguo 23/03/2011, 12:23
Avatar de ghidalgoram  
Fecha de Ingreso: marzo-2008
Ubicación: Costa Rica
Mensajes: 446
Antigüedad: 16 años, 8 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...
  #2 (permalink)  
Antiguo 23/03/2011, 14:35
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 10 meses
Puntos: 845
Respuesta: Variable no se actualiza con "responseText"

Que tal ghidalgoram,

Lo que esta pasando es lo lógico, AJAX es asinronico, osea lanza la petición y continua la ejecución del código, cuando llega al alert todavia no tenes la respuesta, por eso esta vació, todo lo que quieras que se ejecute dependiendo de la respuesta debería ir en onreadystatechange, algo así:

Código Javascript:
Ver original
  1. ...
  2. ajaxobj_recaptcha.onreadystatechange = function() {
  3.     if(ajaxobj_recaptcha.readyState==4 && ajaxobj_recaptcha.status==200) {
  4.         respuesta = ajaxobj_recaptcha.responseText;
  5.         //resto de validaciones
  6.     }
  7. }

la otra solución seria utilizar SJAX, que es la versión sincrónica, esta esperaria la respuesta de la petición y ahi si en el alert te mostraria el valor de la respuesta, para esto deberias cambiar:

Código Javascript:
Ver original
  1. ajaxobj_recaptcha.open('POST', url_proc_form, true);

por

Código Javascript:
Ver original
  1. ajaxobj_recaptcha.open('POST', url_proc_form,  false);

ten en cuenta que "frizzea" el browser esperando la respuesta.

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #3 (permalink)  
Antiguo 24/03/2011, 21:19
Avatar de ghidalgoram  
Fecha de Ingreso: marzo-2008
Ubicación: Costa Rica
Mensajes: 446
Antigüedad: 16 años, 8 meses
Puntos: 7
De acuerdo Respuesta: Variable no se actualiza con "responseText"

Hola masterpuppet

Muy agradecido por el tiempo que sacaste para colaborar. Tu idea es buena, pero no me sirvió. Gracias por tu ayuda.

De paso te comento, que se me ocurrió algo diferente.

Decidí, tratar aparte el caso del Recaptcha. Por ejemplo, el nombre ó ID del campo donde se almacena el código se llama "recaptcha_response_field". Gracias a Dios, se me ocurrió que cuando se pierda el foco de ese campo (recaptcha_response_field), por medio de AJAX, se llame a la función en código PHP, que verifica si fué ó no correctamente escrito el código. Para eso uso el evento onblur. la verificación tarda como 2 segundos y para evitar que el usuario de click al botón de submit, deshabilito ese botón, solo en esos 2 segundos. Luego lo vuelvo habilitar.

La respuesta de este, lo guardo en campo oculto del form. Bueno, ya funciona.

Muchas gracias de nuevo.
Saludos
__________________
Loading...

Etiquetas: ajax, responsetext
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 18:47.