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

Ajax con la funcion Load

Estas en el tema de Ajax con la funcion Load en el foro de Frameworks JS en Foros del Web. Hola a todos. Estoy utilizando la función load de jquery para hacer una petición asincronica como ajax. La uso en un pequeño ejemplo que se ...
  #1 (permalink)  
Antiguo 20/03/2012, 09:09
Avatar de koolj  
Fecha de Ingreso: octubre-2011
Mensajes: 27
Antigüedad: 13 años
Puntos: 1
Exclamación Ajax con la funcion Load

Hola a todos.
Estoy utilizando la función load de jquery para hacer una petición asincronica como ajax.
La uso en un pequeño ejemplo que se puede adaptar a varias situaciones. el ejemplo hace la petición a un archivo php. El problema que tengo es que al hacer uso por primera vez el formulario que hace la petición se queda sin hacer nada. Pero al llenar datos en el formulario por segunda vez funciona todo bien.

No se si estoy haciendo algo mal o que pasa.

Les agradecería su ayuda.

Este es el codigo donde esta el formulario, los estilos, la llamada al archivo jquery.js que la pueden cambiar y el script que utiliza el jquery.
Código:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Formulario</title>
<script type="text/javascript" language="javascript" src="../jquery.js"></script>
<script type="text/javascript" language="javascript">
$(document).ready(function(){
	$("#btEnviar").click(function(){
		$("#cargando").css("display", "inline");
		var myAleatorio = parseInt(Math.random()*999999999);
		$("#destino").load("mostrar-datos.php?txtNombre=" + $("#txtNombre").val()+"&txtApellidos=" + $("#txtApellidos").val() + "&txtTelefono=" + $("#txtTelefono").val() + "&txtSexo=" + $("#txtSexo").val()+ "&txtEdad=" + $("#txtEdad").val() + "&ale="+myAleatorio, function(){
			$("#cargando").css("display", "none");
		});
		$('#formulario').each (function(){
			this.reset();
		});
	});
});
</script>
<style type="text/css">
body{
	background-color:#444;
	color:#FFF;
}
h2{
	text-align:center;
	font-family:Verdana, Geneva, sans-serif;
	font-size:28px;
}
.contiene-formulario{
	width:500px;
	background-color:#222;
	color:#FFF;
	border-radius:8px;
	margin:auto;
	font-size:22px;
}
.formulario{
	margin-left:10px;
	margin-right:10px;
}
.boton{
	border-radius:8px;
	font-size:18px;
	background-color:#444;
	color:#FFF;
}
.cargando{
	display:none;
}
.nofloat{
	clear:both;
}
.destino{
	width:500px;
	background-color:#222;
	color:#FFF;
	border-radius:8px;
	margin:auto;
	font-size:22px;
	margin-top:25px;
}
.destino p{
	margin-left:10px;
}
</style>
</head>

<body>
<h2>Envio de datos mediante jquery y la funcion load</h2>
<div class="contiene-formulario"><br />
  <form id="formulario" name="formulario" class="formulario" method="get" action="">
  <fieldset><legend>Datos para el registro:</legend>
  <table width="85%" align="center">
      <tr>
        <td width="30%">Nombre:</td>
        <td width="70%"><input type="text" name="txtNombre" id="txtNombre" /></td>
      </tr>
      <tr>
        <td>Apellidos:</td>
        <td><input type="text" name="txtApellidos" id="txtApellidos" /></td>
      </tr>
      <tr>
        <td>Telefono:</td>
        <td><input type="text" name="txtTelefono" id="txtTelefono" /></td>
      </tr>
      <tr>
        <td>Sexo:</td>
        <td>
        <select name="txtSexo" id="txtSexo">
        <option>Masculino</option>
        <option>Femenino</option>
        </select></td>
      </tr>
      <tr>
        <td>Edad:</td>
        <td>
        <select name="txtEdad" id="txtEdad">
        <option>18</option>
        <option>19</option>
        <option>20</option>
        <option>21</option>
        <option>22</option>
        <option>23</option>
        <option>24</option>
        </select>
        </td>
      </tr>
      <tr>
        <td align="right"><input type="button" name="btEnviar" id="btEnviar" class="boton" value="Enviar" /></td>
        <td align="right"><div class="cargando" id="cargando"><img src="http://s13.postimage.org/55b1f5hqf/loading2.gif" alt="load" /></div></td>
      </tr>      
    </table></fieldset><br />
  </form>
</div>
<div class="nofloat"></div>
<div class="destino" id="destino"></div>
</body>
</html>
Y este es el código del archivo mostrar-datos.php

Código PHP:
<?php
 sleep
(1);
 if(
$_GET)
 {
     
$nombre $_GET["txtNombre"];
     
$apellidos $_GET["txtApellidos"];
     
$telefono $_GET["txtTelefono"];
     
$sexo $_GET["txtSexo"];
     
$edad $_GET["txtEdad"];
     echo 
"<p>";
     
     echo 
$nombre." ".$apellidos." ".$telefono." ".$sexo." ".$edad;
     echo 
"</p>";
 }
?>
Utilizo la funcio sleep() de php para poder ver bien lo que pasa.
  #2 (permalink)  
Antiguo 20/03/2012, 11:20
Avatar de Naahuel  
Fecha de Ingreso: marzo-2011
Ubicación: localhost
Mensajes: 796
Antigüedad: 13 años, 8 meses
Puntos: 192
Respuesta: Ajax con la funcion Load

Yo te propondría los siguientes cambios:

Prueba: http://nahueljose.com.ar/ejemplos/ajax-test/
Código:
Código HTML:
Ver original
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  4. <title>Formulario</title>
  5. <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
  6. <script type="text/javascript" language="javascript">
  7. $(document).ready(function(){
  8.     //objetos del dom que uso con frecuencia
  9.     var img_cargando = $("#cargando");
  10.     var cont_destino = $("#destino");
  11.     var formulario = $('#formulario');
  12.     //asignación de evento
  13.     formulario.submit(function(evento){
  14.         evento.preventDefault();            //no enviar el formulario
  15.         img_cargando.show();                //mostrar cargando
  16.         //generar datos
  17.         var datos = formulario.serialize();
  18.         //pedido ajax
  19.         var pedido = $.ajax({
  20.             url : 'mostrar-datos.php',
  21.             data : datos,
  22.             cache : false
  23.         });
  24.         //cuando el pedido esté listo...
  25.         pedido.done(function(resultado){
  26.             img_cargando.hide();            //ocultar cargando
  27.             cont_destino.html(resultado);   //cargar el resultado
  28.         });
  29.         //limpiar el formulario
  30.         formulario.each(function(){
  31.             this.reset();
  32.         });
  33.     });
  34. });
  35. <style type="text/css">
  36. body{
  37.     background-color:#444;
  38.     color:#FFF;
  39. }
  40. h2{
  41.     text-align:center;
  42.     font-family:Verdana, Geneva, sans-serif;
  43.     font-size:28px;
  44. }
  45. .contiene-formulario{
  46.     width:500px;
  47.     background-color:#222;
  48.     color:#FFF;
  49.     border-radius:8px;
  50.     margin:auto;
  51.     font-size:22px;
  52. }
  53. .formulario{
  54.     margin-left:10px;
  55.     margin-right:10px;
  56. }
  57. .boton{
  58.     border-radius:8px;
  59.     font-size:18px;
  60.     background-color:#444;
  61.     color:#FFF;
  62. }
  63. .cargando{
  64.     display:none;
  65. }
  66. .nofloat{
  67.     clear:both;
  68. }
  69. .destino{
  70.     width:500px;
  71.     background-color:#222;
  72.     color:#FFF;
  73.     border-radius:8px;
  74.     margin:auto;
  75.     font-size:22px;
  76.     margin-top:25px;
  77. }
  78. .destino p{
  79.     margin-left:10px;
  80. }
  81. </head>
  82.  
  83. <h2>Envio de datos mediante jquery y la funcion load</h2>
  84. <div class="contiene-formulario"><br />
  85.   <form id="formulario" name="formulario" class="formulario" method="get" action="">
  86.   <fieldset><legend>Datos para el registro:</legend>
  87.   <table width="85%" align="center">
  88.       <tr>
  89.         <td width="30%">Nombre:</td>
  90.         <td width="70%"><input type="text" name="txtNombre" id="txtNombre" /></td>
  91.       </tr>
  92.       <tr>
  93.         <td>Apellidos:</td>
  94.         <td><input type="text" name="txtApellidos" id="txtApellidos" /></td>
  95.       </tr>
  96.       <tr>
  97.         <td>Telefono:</td>
  98.         <td><input type="text" name="txtTelefono" id="txtTelefono" /></td>
  99.       </tr>
  100.       <tr>
  101.         <td>Sexo:</td>
  102.         <td>
  103.         <select name="txtSexo" id="txtSexo">
  104.         <option>Masculino</option>
  105.         <option>Femenino</option>
  106.         </select></td>
  107.       </tr>
  108.       <tr>
  109.         <td>Edad:</td>
  110.         <td>
  111.         <select name="txtEdad" id="txtEdad">
  112.         <option>18</option>
  113.         <option>19</option>
  114.         <option>20</option>
  115.         <option>21</option>
  116.         <option>22</option>
  117.         <option>23</option>
  118.         <option>24</option>
  119.         </select>
  120.         </td>
  121.       </tr>
  122.       <tr>
  123.         <td align="right"><input type="submit" name="btEnviar" id="btEnviar" class="boton" value="Enviar" /></td>
  124.         <td align="right"><div class="cargando" id="cargando"><img src="http://s13.postimage.org/55b1f5hqf/loading2.gif" alt="load" /></div></td>
  125.       </tr>      
  126.     </table></fieldset><br />
  127.   </form>
  128. </div>
  129. <div class="nofloat"></div>
  130. <div class="destino" id="destino"></div>
  131. </body>
  132. </html>

Observá lo siguiente:
  • Saqué la obtención de los objetos del DOM fuera de la función. Es más eficiente que recorrer todo el DOM cada vez que se ejecuta la función.
  • Cambié el evento click sobre el botón a un submit para que funcione al presionar enter. Además, hay que cambiar el botón de type="button" a type="submit".
  • Cambié de .load() a $.ajax por muchos motivos. Principalmente porque no es necesario pasar una variable aleatoria a la URL, basta con poner cache:false. Además, podemos usar .serialize(), que permite adaptar este código a cualquier formulario sin estar armando el URL manualmente. Mejor, no? El código queda muuuucho más limpio y comprensible.
  • $.ajax devuelve un .primise() de un deferred, que permite usar .done() para limpiar el código y además usar cuantas funciones callback querramos.

Estas son prácticas que yo siempre trato de seguir para un código de más calidad y sobre todo, que me permita utilizarlo en otros proyectos fácilmente.

¿Se solucionó con esto tu problema? (Yo no lo noté al principio tampoco...)
__________________
nahueljose.com.ar
  #3 (permalink)  
Antiguo 20/03/2012, 13:12
Avatar de koolj  
Fecha de Ingreso: octubre-2011
Mensajes: 27
Antigüedad: 13 años
Puntos: 1
Respuesta: Ajax con la funcion Load

Muchas gracias Naahuel por tu ayuda. Y si tienes razón tu código esta mucho mejor y limpio. Recién estoy en esto de ajax y jquery que por cierto me parece muy interesante.
Gracias de nuevo.

Etiquetas: jquery
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 04:57.