Foros del Web » Programando para Internet » Jquery »

No recargar la web tras petición AJAX

Estas en el tema de No recargar la web tras petición AJAX en el foro de Jquery en Foros del Web. Buenas: Estoy creando un formulario que, antes de enviar nada, valida los datos con Javascript. Hago varias validaciones correctamente, así que hasta ahi todo bien. ...
  #1 (permalink)  
Antiguo 13/08/2014, 18:40
 
Fecha de Ingreso: abril-2009
Ubicación: En foros del web, normalmente en Web general, HTML y CSS.
Mensajes: 258
Antigüedad: 15 años
Puntos: 3
No recargar la web tras petición AJAX

Buenas:

Estoy creando un formulario que, antes de enviar nada, valida los datos con Javascript. Hago varias validaciones correctamente, así que hasta ahi todo bien.

El tema está en que también tengo que comprobar si el correo que ha introducido el usuario ya se encuentra en la base de datos, por tanto se debe hacer con AJAX porque tengo que ejecutar un fichero PHP sin recargar la web. Este es el código:

Código Javascript:
Ver original
  1. function validarCorreo() {
  2.  
  3.     var email = document.getElementsByName("c_email")[0].value; //Obtengo el email que ha introducido el usuario
  4.  
  5.             $.ajax({
  6.                 type: "post", //Petición por POST
  7.                 url: "./account/checkCreateErrors.php", //Fichero PHP que necesito ejecutar para comprobar si el email ya existe
  8.                 data: { "c_email" : email }, //Le envío el email como parámetro
  9.                 success: function(result) { //Tras obtener el resultado ->
  10.                     if(result == "exist") { //Si el correo existe muestro un mensaje de error y devuelvo false para que no se envíe el formulario
  11.                         var p = document.getElementsByName("c_error_email");
  12.                         p[0].style.height = "auto";
  13.                         p[0].style.opacity = 1;
  14.                         return false;
  15.                     }
  16.                     else { //Si no existe oculto el mensaje de error
  17.                         var p = document.getElementsByName("c_error_email");
  18.                         p[0].style.height = "0px";
  19.                         p[0].style.opacity = 0;                    
  20.                     }
  21.                 }
  22.             });
  23. }

Se hace todo a la perfección (tanto la comprobación como la obtención del resultado y la impresión del mensaje de error), el único inconveniente es que ¡pase lo que pase me recarga la web!.

Como podéis observar, si el correo ya existe se devuelve "false" lo cual lo recibe el submit del formulario:

Código HTML:
Ver original
  1. <input name="enter" type="submit" value="Enter" onclick="return checkCreateErrors()">

En todas las validaciones, si recibe "false", no hace nada y por tanto no se recarga la web. Pero en el caso de esta que utilizo AJAX (no sé si tendrá algo que ver), devuelva lo que devuelva siempre se ejecuta el submit.

Seguro que es una chorrada pero no lo veo. Un saludo.
__________________
¿Por qué Anónimo?, porque como está el mundo no podemos considerarnos humanos...
  #2 (permalink)  
Antiguo 13/08/2014, 19:19
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: No recargar la web tras petición AJAX

Hola:

No sé que librerías usas; deberías indicarlo (mejor aún deberías haber publicado el tema en el subforo adecuado)...
las peticiones ajax no recargan la página si están bien... las opciones son que la petición la hagas desde un enlace o de un botón submit, y luego no canceles el evento o que tras un error se aborte la ejecución antes de la cancelación, y en consecuencia siga la ejecución normal (se enlace o se envíe el form).

En tu código muestras una función que no se utiliza, en cambio asocias al submit una función que no nos muestras.

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #3 (permalink)  
Antiguo 13/08/2014, 20:01
Avatar de Hugo_Euan  
Fecha de Ingreso: abril-2011
Ubicación: Mérida, Yucatán, México
Mensajes: 193
Antigüedad: 13 años
Puntos: 71
Respuesta: No recargar la web tras petición AJAX

Cambia el Submit por un botón normal, cuando se te dé el caso de direccionamiento hazlo mediante javascript
__________________
Se acepta Karma (:

Si Dios con nosotros, quien contra nosotros !!
  #4 (permalink)  
Antiguo 14/08/2014, 02:03
 
Fecha de Ingreso: abril-2009
Ubicación: En foros del web, normalmente en Web general, HTML y CSS.
Mensajes: 258
Antigüedad: 15 años
Puntos: 3
Respuesta: No recargar la web tras petición AJAX

Cita:
Hola:

No sé que librerías usas; deberías indicarlo (mejor aún deberías haber publicado el tema en el subforo adecuado)...
las peticiones ajax no recargan la página si están bien... las opciones son que la petición la hagas desde un enlace o de un botón submit, y luego no canceles el evento o que tras un error se aborte la ejecución antes de la cancelación, y en consecuencia siga la ejecución normal (se enlace o se envíe el form).

En tu código muestras una función que no se utiliza, en cambio asocias al submit una función que no nos muestras.

Saludos
Cierto, me he equivocado al escribir en el post el nombre de la función en el botón, pero no hay más que cambiar eso, aquí está el código completo:

Código Javascript:
Ver original
  1. function validarCorreo() {
  2.      
  3.         var email = document.getElementsByName("c_email")[0].value; //Obtengo el email que ha introducido el usuario
  4.      
  5.                 $.ajax({
  6.                     type: "post", //Petición por POST
  7.                     url: "./account/checkCreateErrors.php", //Fichero PHP que necesito ejecutar para comprobar si el email ya existe
  8.                     data: { "c_email" : email }, //Le envío el email como parámetro
  9.                     success: function(result) { //Tras obtener el resultado ->
  10.                         if(result == "exist") { //Si el correo existe muestro un mensaje de error y devuelvo false para que no se envíe el formulario
  11.                             var p = document.getElementsByName("c_error_email");
  12.                             p[0].style.height = "auto";
  13.                             p[0].style.opacity = 1;
  14.                             return false;
  15.                         }
  16.                         else { //Si no existe oculto el mensaje de error
  17.                             var p = document.getElementsByName("c_error_email");
  18.                             p[0].style.height = "0px";
  19.                             p[0].style.opacity = 0;                    
  20.                         }
  21.                     }
  22.                 });
  23.     }

Código HTML:
Ver original
  1. <input name="enter" type="submit" value="Enter" onclick="return validarCorreo()">

En cuanto a la librería, importo Jquery en su última versión:

Código HTML:
Ver original
  1. ...
  2. <script type="text/javascript" src="./resource/js/jquery-2.1.1.min.js"></script>
  3. ...
  4. </head>

A ver si podéis decirme donde está el error. Un saludo.
__________________
¿Por qué Anónimo?, porque como está el mundo no podemos considerarnos humanos...

Última edición por Anonimo12; 14/08/2014 a las 02:22
  #5 (permalink)  
Antiguo 14/08/2014, 03:47
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 9 años, 8 meses
Puntos: 182
Respuesta: No recargar la web tras petición AJAX

Buenas,

El problema es que declaras el boton de tipo submit, que envia automaticamente el formulario.

Tienes que usar:

Código Javascript:
Ver original
  1. <input name="enter" type="button" value="Enter" onclick="return validarCorreo()">

Un saludo
  #6 (permalink)  
Antiguo 14/08/2014, 04:48
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 7 meses
Puntos: 454
Respuesta: No recargar la web tras petición AJAX

Hola:

El problema es que validarCorreo() no devuelve nada. Fíjate que validarCorreo() hace una petición ajax, indicando que cuando llegue la respuesta se llame a success() y termina sin devolver nada.

Cuando más adelante llegue la respuesta ajax, se llamara a success() y esta será la función que devuelva true o false y eso no llegará al submit de ninguna forma.

Tendrías que hacer la petición ajax síncrona, es decir, que espere por la respuesta, poniendo algo así

Código Javascript:
Ver original
  1. $.ajax({
  2.    type: "post", //Petición por POST
  3.    async: false,
  4.    ...

de esta forma el código de validarCorreo() quedará "bloqueado" hasta que llegue la respuesta. Tu codigo en success() puede rellenar una variable con true o false según sea o no valido el correo y validarCorreo() hacer después de la llamada a ajax un return de esa variable.

Se bueno.
__________________
Apuntes Java
Wiki de Programación

Última edición por chuidiang; 14/08/2014 a las 04:58
  #7 (permalink)  
Antiguo 14/08/2014, 05:35
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: No recargar la web tras petición AJAX

Hola:

Que poco me gusta que recomienden evitar los botones submit... un vicio que no me gusta fomentar... además, que primero funcione todo correctamente sin javascript, y luego mejorar la funcionalidad con ajax (o las alternativas que puedan existir)... en resúmen, mantener la accesibilidad...

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #8 (permalink)  
Antiguo 14/08/2014, 05:47
 
Fecha de Ingreso: abril-2009
Ubicación: En foros del web, normalmente en Web general, HTML y CSS.
Mensajes: 258
Antigüedad: 15 años
Puntos: 3
Respuesta: No recargar la web tras petición AJAX

Cita:
Hola:

El problema es que validarCorreo() no devuelve nada. Fíjate que validarCorreo() hace una petición ajax, indicando que cuando llegue la respuesta se llame a success() y termina sin devolver nada.

Cuando más adelante llegue la respuesta ajax, se llamara a success() y esta será la función que devuelva true o false y eso no llegará al submit de ninguna forma.

Tendrías que hacer la petición ajax síncrona, es decir, que espere por la respuesta, poniendo algo así

Código ASP:
Ver original
  1. $.ajax({
  2.        type: "post", //Petición por POST
  3.        async: false,
  4.        ...
¡Perfecto!, ese era el problema, ya lo he solucionado gracias por la respuesta.

Voy a lanzar otra duda que va en el mismo hilo aunque es mas conceptual que práctica:

Con JavaScript controlo que el formulario se haya rellenado correctamente, sin embargo, no sé si el usuario modificando el código fuente desde su navegador (ya que JavaScript es de lado del cliente y no del servidor) me puede enviar los datos erróneos al reescribir la función.

Mi duda es: ¿Además debería rehacer la comprobación cuando fichero PHP reciba los datos del formulario para evitar insertar en la BD información errónea?, ¿o el navegador de por si evita estos problemas?.

Un saludo.
__________________
¿Por qué Anónimo?, porque como está el mundo no podemos considerarnos humanos...
  #9 (permalink)  
Antiguo 14/08/2014, 05:50
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 9 años, 8 meses
Puntos: 182
Respuesta: No recargar la web tras petición AJAX

Buenas,

No recomendamos nada, sino que tratamos de dar una solucion a un problema concreto con unos requerimientos concretos.

Desde el momento en el que el requerimiento tecnico pasa por realizar una llamada ajax sin recarga de la pagina, la accesibilidad ya ha pasado a la historia.

No me habia fijado en ese return, pero a mi me parece una solucion mucho mas limpia la de poner el boton a button que la de hacer una llamada sincrona ajax, ya que esta ultima puede dejar tostado el navegador.


Un saludo
  #10 (permalink)  
Antiguo 14/08/2014, 05:54
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 9 años, 8 meses
Puntos: 182
Respuesta: No recargar la web tras petición AJAX

Cita:
¿Además debería rehacer la comprobación cuando fichero PHP reciba los datos del formulario para evitar insertar en la BD información errónea?, ¿o el navegador de por si evita estos problemas?.
La comprobacion de los campos se deberia hacer SIEMPRE en el servidor, y a ser posible, tambien en el cliente.


Un saludo
  #11 (permalink)  
Antiguo 14/08/2014, 06:08
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: No recargar la web tras petición AJAX

Hola:

Cita:
Iniciado por Anonimo12 Ver Mensaje
Mi duda es: ¿Además debería rehacer la comprobación cuando fichero PHP reciba los datos del formulario para evitar insertar en la BD información errónea?, ¿o el navegador de por si evita estos problemas?.
Siempre hemos aconsejado, al menos en estos foros una doble validación, y la más importante la del servidor... el código sería similar.

Cita:
Iniciado por Profesor_Falken Ver Mensaje
...

Desde el momento en el que el requerimiento tecnico pasa por realizar una llamada ajax sin recarga de la pagina, la accesibilidad ya ha pasado a la historia.
¡NO!, Usar Ajax no tiene nada que ver con la accesibilidad... puedes hacer una búsqueda y verás que es muy normal.

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

Última edición por caricatos; 14/08/2014 a las 06:09 Razón: ortografía
  #12 (permalink)  
Antiguo 14/08/2014, 06:49
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 9 años, 8 meses
Puntos: 182
Respuesta: No recargar la web tras petición AJAX

Cita:
¡NO!, Usar Ajax no tiene nada que ver con la accesibilidad... puedes hacer una búsqueda y verás que es muy normal.

no tiene nada que ver con la accesibilidad???? que afirmacion tan rotunda! Sobre todo cuando una simple busqueda solo retorna resultados precisamente sobre los multiples problemas que presenta Ajax para la accesibilidad si no se utiliza con un extremo cuidado:


http://webaim.org/techniques/ajax/
http://www.webcredible.co.uk/user-friendly-resources/web-accessibility/ajax-accessibility.shtml
http://www.paciellogroup.com/blog/2008/02/ajax-and-screen-readers-content-access-issues/
http://www.smashingmagazine.com/2010/02/10/some-things-you-should-know-about-ajax/


Un saludo
  #13 (permalink)  
Antiguo 14/08/2014, 08:24
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: No recargar la web tras petición AJAX

Hola:

Cita:
Iniciado por Profesor_Falken Ver Mensaje
... multiples problemas que presenta Ajax para la accesibilidad si no se utiliza con un extremo cuidado...
Evidentemente todos podemos hacer chapuzas...

Que pena que las referencias no estén en español...

Otra referencia, un apunte mio: Ajax accesible...

Hay veces que obligatoriamente debemos depender de javascript... incluso en esos casos tenemos la complicidad de la etiqueta noscript. pero cuando "generalizamos", debemos impedir discriminar a nuestros visitantes... no es tan difícil.

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #14 (permalink)  
Antiguo 14/08/2014, 12:55
Avatar de Hugo_Euan  
Fecha de Ingreso: abril-2011
Ubicación: Mérida, Yucatán, México
Mensajes: 193
Antigüedad: 13 años
Puntos: 71
Respuesta: No recargar la web tras petición AJAX

Yo te recomiendo usar también técnicas de ofuscación para JavaScript, si alguien va a intentar modificar el código, por lo menos que le cueste un poco de trabajo, digo si es que logra entender el código...

además es una buena practica...

Saludos.
__________________
Se acepta Karma (:

Si Dios con nosotros, quien contra nosotros !!

Etiquetas: ajax, formulario, input, javascript, php, tras
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 20:18.