Comunidad de diseño web y desarrollo en internet online

Mostrar resultado con JS+Ajax en div id dinámico

Citar            
MensajeEscrito el 11 Dic 2012 07:15 pm
Hola a todos. Primera vez que consulto aquí.
Estoy tratando de hacer una aplicación que muestra los distintos registros de una consulta mysql.
A su vez, cada registro tiene un link que llama a una función JavaScript en mi archivo .js que ejecuta otra consulta mysql del archivo procesa.php, y el resultado se muestra en la misma página, sin recargarla, en un div debajo de cada registro individual.
El problema es que una variable '$fila' en index.php cuenta cada registro y el id del div donde se mostrará el resultado es dinámico: contenido$fila, que al final hace un $fila++.
Entonces, cómo hago para que la función .js tome la variable PHP '$fila' y enviar el resultado al div 'contenido$fila'.
La función que uso funciona sólo si el id del div es estático (p.e. 'contenido') y tan sólo muestra el resultado de 'procesa.php' correspondiente al primer registro de 'index.php', y al cliquear en el link de los otros registros sólo refresca en div 'contenido' del primer registro.
Esta es la función:

Código Javascript :

var req;
 function buscar(valor) {
 if(window.XMLHttpRequest) {
 req = new XMLHttpRequest();
 }
 else if(window.ActiveXObject) {
 req = new ActiveXObject("Microsoft.XMLHTTP");
 }
 var url = "procesa.php?valor="+valor;
 req.open("Get", url, true);
 req.onreadystatechange = function() {
 if(req.readyState == 1) {
 document.getElementById('contenido').innerHTML = 'espere ...';
 }
 if(req.readyState == 4 && req.status == 200) {
 var respuesta = req.responseText;
 document.getElementById('contenido').innerHTML = respuesta;
 }
 }
 req.send(null);
 }

Muchas gracias desde ya por su ayuda.

Por vicbargo

3 de clabLevel



 

opera
Citar            
MensajeEscrito el 11 Dic 2012 08:41 pm
A cada <div> que va a recibir la respuesta Ajax, ponle un id predecible tipo "contenido-n" donde "n" es un número autonumérico (que bien puede ser el índice del registro que estás mostrando).

A la función buscar, le pasas como parámetro ese número. Entonces puedes hacer esto:

Código Javascript :

       if(req.readyState == 4 && req.status == 200) {
       var respuesta = req.responseText;
         document.getElementById('contenido-'+num).innerHTML = respuesta;
       }


Donde "num" sería el parámetro de la función buscar().

¿Se entiende?.

Por DriverOp

Claber

2510 de clabLevel



 

opera
Citar            
MensajeEscrito el 12 Dic 2012 04:10 pm
Muchas gracias por tu ayuda DriverOp.
No se si entendí bien. Lo que hice fue pasar la variable fila como parámetro a la función buscar:

function(valor,fila) {

El parámetro 'valor' es otra variable en index.php de un id a buscar en procesa.php
Pero no se si funciona la solución que me diste porque no logro que el div 'cont$fila' se abra como quiero.
Mi index.php está más o meno así:

Código PHP :

$fila=1;
<tr>
   $valor=$reg[campo3];
   <td>$reg[campo1]</td>
   <td>$reg[campo2]</td>
         <input id='lin' type='hidden' value="<?php echo "$valor";?>" />
         <input id='fil' type='hidden' value="<?php echo "$fila";?>" />
         <a href="javascript:void(0)" onClick="buscar(document.getElementById('lin').value,document.getElementById('fila')">Ver</a>
</tr>
<tr>
   <dif id="cont$fila" style="display: none;"></div>
</tr>
$fila++;

O sea que el div cont$fila está inicialmente oculto, doy click para abrirlo y cuando cliqueo otra fila se cerraba el que estuviera abierto.
Esta función hace eso bien:

Código Javascript :

function SwitchBox(bx) {
   // bx: id del contenedor
   // btn: botón a cambiar imagen y texto
   var  estado = document.getElementById(bx).style.display 
   if (estado=='none') {
      document.getElementById(bx).style.display    = 'block';
   } else {
      document.getElementById(bx).style.display    = 'none';
   } // endif
}

Pero cómo hago para que trabaje junto con la función 'buscar'. Porque 'buscar' sólo abre el primer div (del primer registro) con el resultado del primer registro solamente, aunque cliquee en otra fila. Como que luego de mostrar el primer resultado ya no hace más el '$fila++'.
Muchas gracias de nuevo por tu ayuda y disposición.

Por vicbargo

3 de clabLevel



 

opera
Citar            
MensajeEscrito el 12 Dic 2012 05:03 pm
Primero arregla el error de sintaxis que tienes en el código HTML. Has puesto <dif> en vez de <div> en el que tiene el id="cont$fila".

A modo de ejemplo de la solución que propongo he hecho la siguiente página:

http://www.fivemedia.com.ar/test/test186.php

Solo mira el código fuente. Observa especialmente la línea 25, los parámetros de la función buscar y cómo la llamo desde el tag <a> en la tabla.

El archivo procesa.php solamente devuelve un mensaje con el parámetro por GET.

El otro problema que mencionas en tu último mensaje también se puede solucionar pero es mucho más sencillo hacerlo con JQuery en vez de hacerlo con JavaScript "a pelo".

Por DriverOp

Claber

2510 de clabLevel



 

opera
Citar            
MensajeEscrito el 12 Dic 2012 08:55 pm
Muchas gracias de nuevo.
Hice como dijiste y funcionó. Pero me devolvió los registros con id 1 y 2 de procesa.php
El problema es que el número de registros en el index no es siempre el mismo, por eso al div contenido lo identifico como cont$fila, así que no puedo poner una cantidad fija de divs contenido.
Sucede que el número de registros de index.php se muestran luego que se elige en un formulario más arriba el origen y destino de una línea de ómnibus; p.e., entre Santiago y Mendoza puede que hayan menos lineas (registros) que entre Santiago y Valparaíso.
El avance que ha habido es que se abre el div correspondiente al link de cada fila en su lugar correspondiente. Para ello sigo pasando '$fila' como parámetro. Pero en el div contenido lo que aparece es "espere ..." y queda así.
Mil gracias de nuevo y espero puedan ayudarme.

Por vicbargo

3 de clabLevel



 

opera
Citar            
MensajeEscrito el 13 Dic 2012 12:25 pm
Pero es que nada te impide imprimir un valor cualquiera con PHP en los lugares adecuados del código HTML o JavaScript.

Lo lamento, pero puedo ayudar con el código, pero no con la falta de imaginación...

Por DriverOp

Claber

2510 de clabLevel



 

opera

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.