Foros del Web » Programando para Internet » PHP »

Responder petición al objeto XMLHttpRequest con AJAX

Estas en el tema de Responder petición al objeto XMLHttpRequest con AJAX en el foro de PHP en Foros del Web. Estoy aprendiendo ajax. Mi objetivo ahora mismo es crear un formulario y al presionar el botón enviar, me salgan los datos enviados en un div. ...
  #1 (permalink)  
Antiguo 14/07/2012, 20:34
 
Fecha de Ingreso: octubre-2011
Mensajes: 58
Antigüedad: 12 años, 6 meses
Puntos: 0
Responder petición al objeto XMLHttpRequest con AJAX

Estoy aprendiendo ajax.

Mi objetivo ahora mismo es crear un formulario y al presionar el botón enviar, me salgan los datos enviados en un div.

Este es el codigo html con el formulario creado:
Código HTML:
Ver original
  1. <h1> Formulario de prueba </h1>
  2.  
  3.     <form method="post" action="">
  4.         <table border="1">
  5.             <tr>
  6.                 <td> Nombre </td>
  7.                 <td> <input type="text" name="txtNombre" />
  8.             </tr>
  9.             <tr>
  10.                 <td> Apellido </td>
  11.                 <td> <input type="text" name="txtApellido" />
  12.             </tr>
  13.             <tr>
  14.                 <td colspan="2">
  15.                     <button type="button"> Enviar </button>
  16.                 </td>
  17.             </tr>
  18.         </table>
  19.     </form>
  20.  
  21.     <div id="datosEnviados"></div>

El codigo javascript/ajax
Código Javascript:
Ver original
  1. <script type="text/javascript">
  2.         var peticion_http = null;
  3.         var READY_STATE_COMPLETE = 4;
  4.  
  5.         function iniciar_xhr(){
  6.             if(window.XMLHttpRequest){
  7.                 return new XMLHttpRequest();
  8.             }
  9.         }
  10.  
  11.         window.onload = function(){
  12.             peticion_http = iniciar_xhr();
  13.             btnEnviar = document.getElementsByTagName("button")[0];
  14.             btnEnviar.onclick = enviarPeticion;
  15.         }
  16.  
  17.         function enviarPeticion(){
  18.             nombre = document.getElementsByName("txtNombre")[0].value;
  19.             apellido = document.getElementsByName("txtApellido")[0].value;
  20.  
  21.             query_string = "nombre=" + encodeURIComponent(nombre) +
  22.                            "&apellido=" + encodeURIComponent(apellido) +
  23.                            "&nocache=" +Math.random();
  24.  
  25.  
  26.             peticion_http.onreadystatechange = verDatosRecibidos;
  27.             peticion_http.open("POST","http://localhost/AJAX/formulario.php", true);
  28.             peticion_http.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
  29.             peticion_http.send(query_string);
  30.  
  31.         }
  32.  
  33.         function verDatosRecibidos(){
  34.             if(peticion_http.readyState == READY_STATE_COMPLETE){
  35.                 if(peticion_http.status == 200) {
  36.                     alert(peticion_http.responseText);
  37.                 }
  38.             }
  39.            
  40.         }
  41.     </script>

Por ahora eso funciona, pero el problema es que la propiedad responseText del objeto XMLHttpRequest me trae TODO el contenido del documento, todo el codigo de la pagina completa (que también incluye los datos enviados por post) pero yo solo quiero los datos que se enviaron ¿no hay alguna forma de filtrarlos sin tener que usar XML?
__________________
La libertad más difícil de conservar es la de equivocarse. - Morris Wes

Lo que faltaba en internet: http://binar10s.blogspot.com/
  #2 (permalink)  
Antiguo 14/07/2012, 20:42
Avatar de Nemutagk
Colaborador
 
Fecha de Ingreso: marzo-2004
Ubicación: México
Mensajes: 2.633
Antigüedad: 20 años
Puntos: 406
Respuesta: Responder petición al objeto XMLHttpRequest con AJAX

Cita:
Por ahora eso funciona, pero el problema es que la propiedad responseText del objeto XMLHttpRequest me trae TODO el contenido del documento, todo el codigo de la pagina completa (que también incluye los datos enviados por post) pero yo solo quiero los datos que se enviaron ¿no hay alguna forma de filtrarlos sin tener que usar XML?
A que te refieres con filtrar? xml?, mmm no explicas bien como es que recibe PHP los datos via post, ni como los imprimes (envias la respuesta a XMLHttpRequest), en fin, por lo que entiendo, es que no solo te muestra los datos enviados via POST, si no que te retorna igual el formulario, etc, si es eso, solo es necesario que crees un if donde detecte la petición via post y solo envies lo datos recibidos...

Código PHP:
Ver original
  1. <?php
  2. if (isset($_POST['nombre'])) {
  3.      //Imprimes de la forma que necesites entregar la respuesta a XMLHttpRequest...
  4.      echo $_POST['nombre'];
  5. }else {
  6.     //aquí todo tu código HTML, formulario, etc...
  7. }
  8. ?>
__________________
Listo?, tendría que tener 60 puntos menos de IQ para considerarme listo!!!
-- Sheldon Cooper
http://twitter.com/nemutagk
PD: No contestaré temas vía mensaje personal =)
  #3 (permalink)  
Antiguo 14/07/2012, 21:32
 
Fecha de Ingreso: octubre-2011
Mensajes: 58
Antigüedad: 12 años, 6 meses
Puntos: 0
Respuesta: Responder petición al objeto XMLHttpRequest con AJAX

Gracias.
Vi un tutorial de los de la pagina thenewboston, ellos lo hacen con jquery, pero con ese vídeo entendí mejor.

Lo que pasa es que el responseText siempre trae todo el codigo html. Así que creo que es mejor enviar a otra pagina la petición, procesar en esa página y solo mandar devuelta la respuesta. Así es más sencillo aunque se crearían más páginas.

Otra cosa que estaba haciendo mal es que pensaba que tenía que utilizar los name que le había puesto en el html, pero son los name que mando en el query_string.

Dejo el codigo:

formulario.php

Código Javascript:
Ver original
  1. <?php
  2.     echo "<pre>";
  3.         print_r($_POST);
  4.     echo "</pre>";
  5.  
  6. ?>
  7.  
  8. <html>
  9. <head>
  10.     <title>Formulario</title>
  11.  
  12.     <script type="text/javascript">
  13.         var peticion_http = null;
  14.         var READY_STATE_COMPLETE = 4;
  15.  
  16.         function iniciar_xhr(){
  17.             if(window.XMLHttpRequest){
  18.                 return new XMLHttpRequest();
  19.             }
  20.         }
  21.  
  22.         window.onload = function(){
  23.             peticion_http = iniciar_xhr();
  24.             btnEnviar = document.getElementsByTagName("button")[0];
  25.             btnEnviar.onclick = enviarPeticion;
  26.         }
  27.  
  28.         function enviarPeticion(){
  29.             nombre = document.getElementsByName("txtNombre")[0].value;
  30.             apellido = document.getElementsByName("txtApellido")[0].value;
  31.  
  32.             query_string = "nombre=" + encodeURIComponent(nombre) +
  33.                            "&apellido=" + encodeURIComponent(apellido) +
  34.                            "&nocache=" +Math.random();
  35.  
  36.  
  37.             peticion_http.onreadystatechange = verDatosRecibidos;
  38.             peticion_http.open("POST","http://localhost/AJAX/servidor.php", true);
  39.             peticion_http.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
  40.             peticion_http.send(query_string);
  41.  
  42.         }
  43.  
  44.         function verDatosRecibidos(){
  45.             if(peticion_http.readyState == READY_STATE_COMPLETE){
  46.                 if(peticion_http.status == 200) {
  47.                     div = document.getElementById("datosEnviados");
  48.                     respuesta = peticion_http.responseText.split(",");
  49.  
  50.                     div.innerHTML = "Nombre: " +respuesta[0] +
  51.                                     "<br/>Apellido: " +respuesta[1];
  52.  
  53.                     alert(peticion_http.responseText);
  54.                 }
  55.             }
  56.            
  57.         }
  58.     </script>
  59.  
  60. </head>
  61. <body>
  62.     <h1> Formulario de prueba </h1>
  63.  
  64.  
  65.         <table>
  66.             <tr>
  67.                 <td> Nombre </td>
  68.                 <td> <input type="text" name="txtNombre" />
  69.             </tr>
  70.             <tr>
  71.                 <td> Apellido </td>
  72.                 <td> <input type="text" name="txtApellido" />
  73.             </tr>
  74.             <tr>
  75.                 <td colspan="2">
  76.                     <button type="button"> Enviar </button>
  77.                 </td>
  78.             </tr>
  79.         </table>
  80.  
  81.     <div id="datosEnviados"></div>
  82. </body>
  83. </html>

servidor.php
Código PHP:
Ver original
  1. <?php
  2.     echo $_POST['nombre'];
  3.     echo ",";
  4.     echo $_POST['apellido'];
  5.  
  6. ?>
__________________
La libertad más difícil de conservar es la de equivocarse. - Morris Wes

Lo que faltaba en internet: http://binar10s.blogspot.com/

Última edición por link01; 14/07/2012 a las 21:42
  #4 (permalink)  
Antiguo 14/07/2012, 22:41
Avatar de Nemutagk
Colaborador
 
Fecha de Ingreso: marzo-2004
Ubicación: México
Mensajes: 2.633
Antigüedad: 20 años
Puntos: 406
Respuesta: Responder petición al objeto XMLHttpRequest con AJAX

A ver, no confundas, responseText tal cual dice su nombre es para indicar y tratar la respuesta como texto por lo tanto Javascript no los tratará como XML, esto no quiere decir que retornará toda la página o solo una parte, nada de eso tiene que ver ya que eso depende de como PHP entregue la respuesta a la petición, recuerda que XMLHttpRequest unicamente funciona como "puente" para realizar peticiones al servidor sin que el navegador tenga que recargar la página, por lo tanto, lo que retorne es explícitamente lo que PHP entregue en tu caso, si PHP retorna toda la página es lo que obtendrás en la respuesta desde ajax...

Cita:
Así que creo que es mejor enviar a otra pagina la petición, procesar en esa página y solo mandar devuelta la respuesta. Así es más sencillo aunque se crearían más páginas.
Eso depende de como quieras trabajar, pero nada tiene que ver con responseText, pero el problema de que te trae datos que no son de tu utilidad tiene que ver como entrega PHP el resultado al navegador, en tu caso a la petición ajax...

Cita:
Otra cosa que estaba haciendo mal es que pensaba que tenía que utilizar los name que le había puesto en el html, pero son los name que mando en el query_string.
No, el atributo name es el que le entrega el navegador a PHP para que este le asigne el valor indicado, trabajando con Javascript es mejor usar el atributo ID, aunque esto no quiere decir que este mal como lo estas haciendo, la unica diferencia es que se supone que el valor del atributo ID es unico, por lo tanto no es necesario indicar el index del item a llamar (getElementByName['nombre'][0], el 0 sería el index del item)
__________________
Listo?, tendría que tener 60 puntos menos de IQ para considerarme listo!!!
-- Sheldon Cooper
http://twitter.com/nemutagk
PD: No contestaré temas vía mensaje personal =)
  #5 (permalink)  
Antiguo 15/07/2012, 10:14
 
Fecha de Ingreso: octubre-2011
Mensajes: 58
Antigüedad: 12 años, 6 meses
Puntos: 0
Respuesta: Responder petición al objeto XMLHttpRequest con AJAX

Y entonces ¿cómo controlo lo que php entrega? ¿con condiciones y ese tipo de estructuras?
__________________
La libertad más difícil de conservar es la de equivocarse. - Morris Wes

Lo que faltaba en internet: http://binar10s.blogspot.com/
  #6 (permalink)  
Antiguo 15/07/2012, 10:54
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: Responder petición al objeto XMLHttpRequest con AJAX

Hola:

Te cuento lo que para mí son buenas prácticas. Para empezar, no depender de javascript en la navegación de las páginas, para eso los formularios deben tener su action, método y enctype correctos y que muestren resultados en la página que tengas reservada para ese cometido (con un botón submit, por supuesto)... luego, si quieres usar Ajax, capturar el evento de envío, y hacerlo con el método Ajax (XMLHttpRequest), cancelando el envío del formulario con return false.

Si quieres no usar otra página, el método que yo suelo usar es añadirle una variable adicional; por ejemplo: ajax=si.

Luego en el servidor escribir la página completa si no se cumple la condición de que exista la variable ajax. En caso contrario formatear solo el resultado de la salida...

Sobre usar XML, al menos yo lo suelo usar y me parece una costumbre acertada cuando se quieran datos estructurados, incluso, el destino del formulario puede ser un XML, y con poco esfuerzo lo puedes dejar bonito con una hoja xsl... Te animo a que te informes. Si quieres una referncia, mira este apunte: Ajax, con X de XML.

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

Etiquetas: ajax, formulario, html, objeto, responder, xmlhttprequest
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 12:43.