Yo te propondría los siguientes cambios:
Prueba:
http://nahueljose.com.ar/ejemplos/ajax-test/
Código:
Código HTML:
Ver original<!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"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script> <script type="text/javascript" language="javascript"> $(document).ready(function(){
//objetos del dom que uso con frecuencia
var img_cargando = $("#cargando");
var cont_destino = $("#destino");
var formulario = $('#formulario');
//asignación de evento
formulario.submit(function(evento){
evento.preventDefault(); //no enviar el formulario
img_cargando.show(); //mostrar cargando
//generar datos
var datos = formulario.serialize();
//pedido ajax
var pedido = $.ajax({
url : 'mostrar-datos.php',
data : datos,
cache : false
});
//cuando el pedido esté listo...
pedido.done(function(resultado){
img_cargando.hide(); //ocultar cargando
cont_destino.html(resultado); //cargar el resultado
});
//limpiar el formulario
formulario.each(function(){
this.reset();
});
});
});
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;
}
<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=""> <table width="85%" align="center"> <td width="30%">Nombre:
</td> <td width="70%"><input type="text" name="txtNombre" id="txtNombre" /></td> <td><input type="text" name="txtApellidos" id="txtApellidos" /></td> <td><input type="text" name="txtTelefono" id="txtTelefono" /></td> <select name="txtSexo" id="txtSexo"> <select name="txtEdad" id="txtEdad"> <td align="right"><input type="submit" 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> <div class="destino" id="destino"></div>
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...)