Foros del Web » Programando para Internet » Javascript »

Acordeón que expanda un div y contraiga otro

Estas en el tema de Acordeón que expanda un div y contraiga otro en el foro de Javascript en Foros del Web. Hola. Tengo un acordeón que toma los registros de una base de datos MySQL. Cada vez que doy click en un registro del mismo se ...
  #1 (permalink)  
Antiguo 14/02/2013, 09:26
 
Fecha de Ingreso: agosto-2010
Mensajes: 25
Antigüedad: 13 años, 8 meses
Puntos: 0
Acordeón que expanda un div y contraiga otro

Hola.
Tengo un acordeón que toma los registros de una base de datos MySQL. Cada vez que doy click en un registro del mismo se expande un div (debajo de cada registro) que amplía la información. El problema es que no he logrado que al hacer click sobre otro registro se habra el div correspondiente y se contraiga el que estaba abierto antes, de modo que se pueda ver sólo un div expandido.
Este es la función JavaScript que tengo hasta el momento:

Código Javascript:
Ver original
  1. var req;
  2. function buscar(valor, num) {
  3.      if(window.XMLHttpRequest) {
  4.         req = new XMLHttpRequest();
  5.      }
  6.      else if(window.ActiveXObject) {
  7.         req = new ActiveXObject("Microsoft.XMLHTTP");
  8.      }
  9.     var contenido = document.getElementById('contenido-'+num);
  10.               if (contenido.style.display == 'none')
  11.         {
  12.         contenido.style.display = 'block';
  13.         } else {
  14.         contenido.style.display = 'none';
  15.         }
  16.     var url = "procesa.php?valor="+valor;
  17.      req.open("Get", url, true);
  18.      req.onreadystatechange = function() {
  19.          if(req.readyState == 1) {
  20.             contenido.innerHTML = 'espere ...';
  21.          }
  22.          if(req.readyState == 4 && req.status == 200) {
  23.             var respuesta = req.responseText;
  24.             contenido.innerHTML = respuesta;
  25.          }
  26.      }
  27.      req.send(null);
  28.  }

Muchas gracias por su ayuda.
  #2 (permalink)  
Antiguo 14/02/2013, 11:00
Avatar de Reedyseth  
Fecha de Ingreso: enero-2009
Ubicación: Chihuahua, México
Mensajes: 419
Antigüedad: 15 años, 3 meses
Puntos: 36
Respuesta: Acordeón que expanda un div y contraiga otro

Mira puedes ponerle la misma clase a los div y con javascript creas una funcion en el evento onClick que hara lo siguiente:

Cuando le des click y se vaya al evento onclick llama una funcion que se encargue de ocultar todos los elementos con la clase que asignaste, digamos 'acordeon', y ahi mismo vuelves a mostrar el div que ocultaste anteriormente, seria algo asi:

Código Javascript:
Ver original
  1. function ocultarDivs() {
  2.    var elements = document.getElementsByClassName("acordeon");
  3.    elements.style.display = "none";
  4.    this.style.display = "block";
  5. }

En este caso
Código:
this
hace referencia al objeto/funcion ocultarDivs, que a su vez fue invocado por un div especifico que tenia el evento 'onClick'.
  #3 (permalink)  
Antiguo 14/02/2013, 17:43
 
Fecha de Ingreso: agosto-2010
Mensajes: 25
Antigüedad: 13 años, 8 meses
Puntos: 0
Respuesta: Acordeón que expanda un div y contraiga otro

Muy amable Reedyseth por responderme.
Ahora que tengo esa nueva función "ocultarDivs" mi nueva interrogante es si debo llamarla con el mismo evento onclick que llama a la función "buscar". Además, debo cambiar algo en la función "buscar" para que funcione "ocultarDivs"?
Este es el código PHP donde se invoca la función:
Código PHP:
while ($reg = mysql_fetch_array($res)) {
$num = 1;
echo "<tr>\n";
echo "   <td>$num</td>
          <td>$reg[origen]</td>
          <td>$reg[h]</td>
          <td>\n";
$valor=$reg['linea'];
?>
    <a href='' onClick='buscar(<?php echo "$valor";?>,<?php echo "$num";?>);return false;'>Ver más...</a>
<?php
echo "    </td>\n";
echo 
"</tr>\n";
echo 
"<tr>
        <td colspan='4'>
           <div class='acordeon' id='contenido-$num' style='display: none'>
           </div>
        </td>
     </tr>\n"
;
$num++;
Es una tabla con registros que muestra rutas de viaje, todo se genera dinámicamente. De acuerdo al registro cliqueado por el usuario se despliega el div 'contenido-$num' ampliando la info de ese registro.
Gracias de nuevo y perdón por ser tan rompepelotas.
  #4 (permalink)  
Antiguo 14/02/2013, 18:44
Colaborador
 
Fecha de Ingreso: mayo-2008
Ubicación: $MX['VZ']['Xalapa']
Mensajes: 3.005
Antigüedad: 16 años
Puntos: 528
Respuesta: Acordeón que expanda un div y contraiga otro

este comportamiento lo hace el accordion de jquery ui, quizá te conviniera echarle una mirada
  #5 (permalink)  
Antiguo 14/02/2013, 19:03
Avatar de Reedyseth  
Fecha de Ingreso: enero-2009
Ubicación: Chihuahua, México
Mensajes: 419
Antigüedad: 15 años, 3 meses
Puntos: 36
Respuesta: Acordeón que expanda un div y contraiga otro

Ok mira, como veo que estas usando el XMLHttpRequest seguramente no quieres usar jQuery, o utilizarias el acordeon de jQuery UI, por tal razon te hice un codigo en puro javascript que se encarga de hacer funcionar el acordeon con una estructura como la siguiente:
Código HTML:
<div class="accordeon" onclick="ocultarDivs(this);">
	<h1 >Header 1</h1>			
	<p>Texto 1</p>
</div> 
Puedes darte una clavada en el codigo javascript para que veas como funciona, disculpa que haya puesto la funcion anteriormente, pero es una funcion para que te diera la idea, pero la idea ya realizada segun la estructura html que hice salto este javascript

Código Javascript:
Ver original
  1. function ocultarDivs(e) {
  2.                 console.info("OK");
  3.                 var elements = document.getElementsByClassName("accordeon");
  4.                 for (var i=0; i < elements.length; i++) {
  5.                     var pNode = elements[i].getElementsByTagName("p");
  6.                     pNode[0].style.display = "none";
  7.                 };
  8.                 var toShow = e.getElementsByTagName("p");
  9.                 toShow[0].style.display = "block";
  10.             }

Para que veas como funciona el codigo te dejo una muestra en vivo:

http://fiddle.jshell.net/7u5TZ/

me has dado una buena idea para hacer un post en mi blog y no olvides de calificar las respuestas
__________________
Reedyseth
Te ayudo? No olvides dar un +
blog:http://behstant.com/blog
En el blog:Tutoriales de Desarrollo Web PHP, Javascript, BD y más.
  #6 (permalink)  
Antiguo 15/02/2013, 19:10
 
Fecha de Ingreso: agosto-2010
Mensajes: 25
Antigüedad: 13 años, 8 meses
Puntos: 0
Respuesta: Acordeón que expanda un div y contraiga otro

Gracias de nuevo por la ayuda.
Debo llamar ambas funciones en el mismo evento onclick? Yo lo hice así:
Código HTML:
<div id='contenido-<?php echo $num;?>' class='accordeon' onclick='ocultarDivs(this);buscar(<?php echo "$valor";?>,<?php echo "$num";?>);'> 
Y en la función buscar eliminé la condición if. Pero ahora, la primera vez que cliqueo un registro se muestra la etiqueta <p> con la info ampliada pero desaparece el registro donde cliqueé. Y al cliquear en otro registro ya no se muestra más la info correspondiente.
En el Firebug el error que muestra es:

TypeError: pNode[0] is undefined
[Parar en este error]
pNode[0].style.display = "none";
  #7 (permalink)  
Antiguo 20/02/2013, 11:19
 
Fecha de Ingreso: agosto-2010
Mensajes: 25
Antigüedad: 13 años, 8 meses
Puntos: 0
Respuesta: Acordeón que expanda un div y contraiga otro

Al final lo solucioné con JQuery.
Saludos
  #8 (permalink)  
Antiguo 20/02/2013, 12:42
Avatar de Reedyseth  
Fecha de Ingreso: enero-2009
Ubicación: Chihuahua, México
Mensajes: 419
Antigüedad: 15 años, 3 meses
Puntos: 36
Respuesta: Acordeón que expanda un div y contraiga otro

Que bueno que ya te salio, al final tenias que caer en las redes de jQuery jajaja, saludos.
__________________
Reedyseth
Te ayudo? No olvides dar un +
blog:http://behstant.com/blog
En el blog:Tutoriales de Desarrollo Web PHP, Javascript, BD y más.

Etiquetas: html, php
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 13:15.