Foros del Web » Programando para Internet » Javascript »

mostar DIV y ocultar el resto de DIV's

Estas en el tema de mostar DIV y ocultar el resto de DIV's en el foro de Javascript en Foros del Web. Hola, tengo un pequeño listado de 5 items, que al clicar sobre cada uno de ellos se muestra un div con una pequeña información, lo ...
  #1 (permalink)  
Antiguo 25/10/2009, 10:06
Avatar de marlowe  
Fecha de Ingreso: noviembre-2007
Mensajes: 59
Antigüedad: 16 años, 5 meses
Puntos: 2
mostar DIV y ocultar el resto de DIV's

Hola, tengo un pequeño listado de 5 items, que al clicar sobre cada uno de ellos se muestra un div con una pequeña información, lo que quiero es que al clicar sobre uno de ellos si hay otro visible que se oculte y solo se muestre el que he clicado.
Tengo ésta función que es la que me expande o contrae los div, pero me lo hace uno por uno... no sé si es posible que al clicar sobre uno me oculte el resto de div y me muestre el que interesa.

function expandCode(id){
var parent = document.getElementById(id);

if (parent.style.display === 'none' || parent.style.display === ''){
parent.style.display = 'block';
} else {
parent.style.display = 'none';
}
}


el código html:

<a href="#" onclick="expandCode('news1'); return false;">News 1</a>
<div class="text1" id="news1">
bla bla
</div>

<a href="#" onclick="expandCode('news2'); return false;">News 2</a>
<div class="text1" id="news2">
bla bla
</div>

<a href="#" onclick="expandCode('news3'); return false;">News 3</a>
<div class="text1" id="news3">
bla bla
</div>

<a href="#" onclick="expandCode('news4'); return false;">News 4</a>
<div class="text1" id="news4">
bla bla
</div>

<a href="#" onclick="expandCode('news5'); return false;">News 5</a>
<div class="text1" id="news5">
bla bla
</div>

Gracias de antemano!!!
  #2 (permalink)  
Antiguo 25/10/2009, 13:45
Avatar de ElJavista
Colaborador
 
Fecha de Ingreso: marzo-2007
Ubicación: Lima Perú
Mensajes: 2.231
Antigüedad: 17 años, 2 meses
Puntos: 67
Respuesta: mostar DIV y ocultar el resto de DIV's

Claro que se puede, el problema es que solo tomas funciones que encuentras por ahi y ni siquiera sabes como funcionan. Deberías al menos tratar de comprenderlas para que puedas aplicarlas según sea el caso. Bueno, no voy a darte un script en base al código que haz puesto, te daré otro ejemplo.

Bien, digamos que tenemos esto:

Código:
<ul id="menu">
  <li> <a href="JavaScript:;" class="actual" onclick="setContenido(0);">Uno</a></li>
  <li> <a href="JavaScript:;" onclick="setContenido(1);">Dos</a></li>
  <li> <a href="JavaScript:;" onclick="setContenido(2);">Tres</a></li>
</ul>
<div id="contenidos">
   <div>Contenido 1</div>
   <div>Contenido 2</div>
   <div>Contenido 3</div>
</div>
Vemos que hay un menu (obviamente al cual se le debe poner estilos para que paresca un menu) y tres contenedores de contenidos (valga la redundancia) los cuales están dentro de otro div de id "contenidos". Al darle click a cualquier item debe aparecer el contenido correspondiente y ocultar los otros. Para esto se necesita nada más que esta función:

Código:
function setContenido(n) {
   var menus = document.getElementById('menu').getElementsByTagName('a');
   var contents = document.getElementById('contenidos').getElementsByTagName('div');

   for (var i = 0; i < 3; i ++) {
       menus[i].className = '';
       contents[i].style.display = 'none';
   }

   menus[n].className = 'actual';
   contents[n].style.display = 'block';
}
Bien, eso hará el trabajo. Al principio se referencia todos los items del menú y se quita sus clases, y también se refernecia a todos los div contenedores y se les cambia su estilo a display none para que se oculten. Despues solo al item y contenedor correspondiente se le da la clase y el estilo que se necesita. La clase del item sirve para cambiarle el estilo de modo que paresca seleccionado, normalmente es un cambio en el color de fondo.

Recuerda, si coges funciones por ahi y la quieres aplicar sin entenderlas en varios casos te puede servir pero es algo limitante porque en muchas ocasiones se deben adaptar los codigos. Espero que te sirva.
  #3 (permalink)  
Antiguo 25/10/2009, 14:15
Avatar de buzu  
Fecha de Ingreso: octubre-2006
Ubicación: San Francisco, CA
Mensajes: 2.168
Antigüedad: 17 años, 6 meses
Puntos: 122
Respuesta: mostar DIV y ocultar el resto de DIV's

ElJavista, estás desperdiciando valiosos recursos con un loop. Nada serio en este caso, pero si una pesadilla si tienes muchos elementos. Además, no veo por que usar una clase para luego ir y usar la propiedad style para cambiar los estilos del documento. No es mejor simplemente definir la clase con los estilos que queremos y de esa manera evitar el uso de style?

Lo del loop se resuelve fácilmente. Basta con llevar un registro de los elementos que están visibles. Para eso basta con declarar una variable en la cual almacenamos una referencia al elemento actualmente visible, cuando queramos poner otro visible y ocultar el actual, no necesitaremos recorrer todos los elementos y cambiarlos todos a invisibles haciendo trabajo redundante, simplemente bastará con hacer algo como:

mivariable.className = 'noVisible';

en donde mivariable es la variable que lleva el registro de los elementos visibles y noVisible es la clase que contiene las instrucciones para ocultar el elemento y hacer cualquier otro tipo de cambios necesarios.
__________________
twitter: @imbuzu
  #4 (permalink)  
Antiguo 25/10/2009, 14:43
Avatar de Adler
Colaborador
 
Fecha de Ingreso: diciembre-2006
Mensajes: 4.671
Antigüedad: 17 años, 4 meses
Puntos: 126
Respuesta: mostar DIV y ocultar el resto de DIV's

Yo monté esto hace tiempo

Código javascript:
Ver original
  1. <html>
  2. <style type="text/css">
  3. .ocultar {display:none;}
  4. .mostrar {display:block;}
  5. .sel {color:#FF0000;}
  6. .nosel {color:#000000;}
  7. </style>
  8. <script type="text/javascript">
  9. var visto_subm = null;
  10. var visto_color = null;
  11. function ver(num) {
  12. objhl = document.getElementById(num);
  13. obj = document.getElementById("sub"+num);
  14.  
  15. obj.className = (obj==visto_subm) ? 'ocultar' : 'mostar';
  16. objhl.className = (objhl==visto_color) ? 'nosel' : 'sel';
  17.  
  18.     if ((visto_subm != null) && (visto_color != null)) {
  19.         visto_subm.className = 'ocultar';
  20.         visto_color.className = 'nosel';
  21.     }
  22.  
  23. visto_subm = (obj==visto_subm) ? null : obj;
  24. visto_color = (obj==visto_color) ? null : objhl;
  25. }
  26.  
  27. </script>
  28. <head>
  29. </head>
  30. <body>
  31. Se puede usar ver, ver1 y ver2 por separado<br /><br />
  32. <div id="0" class="nosel" onclick="ver(this.id)" style="z-index:1;">MENU0</div>
  33. <div id="sub0" class="ocultar" style="z-index:1;">
  34. SubMenu0<br />
  35. SubMenu0<br />
  36. SubMenu0
  37. </div>
  38.  
  39. <div id="1" class="nosel" onclick="ver(this.id)" style="z-index:1;">MENU1</div>
  40. <div id="sub1" class="ocultar" style="z-index:1;">
  41. SubMenu1<br />
  42. SubMenu1<br />
  43. SubMenu1
  44. </div>
  45.  
  46.  
  47. <div id="2" class="nosel" onclick="ver(this.id)" style="z-index:1;">MENU2</div>
  48. <div id="sub2" class="ocultar" style="z-index:1;">
  49. SubMenu2<br />
  50. SubMenu2<br />
  51. SubMenu2
  52. </div>
  53.  
  54.  
  55. <div id="3" class="nosel" onclick="ver(this.id)" style="z-index:1;">MENU3</div>
  56. <div id="sub3" class="ocultar" style="z-index:1;">
  57. SubMenu3<br />
  58. SubMenu3<br />
  59. SubMenu3
  60. </div>
  61.  
  62. </body>
  63. </html>

Suerte
__________________
Los formularios se envían/validan con un botón Submit
<input type="submit" value="Enviar" style="background-color:#0B5795; font:bold 10px verdana; color:#FFF;" />
  #5 (permalink)  
Antiguo 25/10/2009, 18:17
Avatar de ElJavista
Colaborador
 
Fecha de Ingreso: marzo-2007
Ubicación: Lima Perú
Mensajes: 2.231
Antigüedad: 17 años, 2 meses
Puntos: 67
Respuesta: mostar DIV y ocultar el resto de DIV's

Cita:
Iniciado por buzu Ver Mensaje
ElJavista, estás desperdiciando valiosos recursos con un loop. Nada serio en este caso, pero si una pesadilla si tienes muchos elementos. Además, no veo por que usar una clase para luego ir y usar la propiedad style para cambiar los estilos del documento. No es mejor simplemente definir la clase con los estilos que queremos y de esa manera evitar el uso de style?

Lo del loop se resuelve fácilmente. Basta con llevar un registro de los elementos que están visibles. Para eso basta con declarar una variable en la cual almacenamos una referencia al elemento actualmente visible, cuando queramos poner otro visible y ocultar el actual, no necesitaremos recorrer todos los elementos y cambiarlos todos a invisibles haciendo trabajo redundante, simplemente bastará con hacer algo como:

mivariable.className = 'noVisible';

en donde mivariable es la variable que lleva el registro de los elementos visibles y noVisible es la clase que contiene las instrucciones para ocultar el elemento y hacer cualquier otro tipo de cambios necesarios.

Bueno, honestamente no sabía que estaba desperdiciando recursos usando un LOOP, pero ya veo porque, he leído sobre optimización en PHP pero nada en cuanto a JavaScript, supongo que tendrán conceptos similares, gracias por hacerme ver que mi código deja mucho que desear. Voy a comenzar a estudiar un poco eso de optimización en JavaScript. Gracias otra vez.

Ahora la pregunta es, por qué evitar el uso de style? podrías aclararme eso?
  #6 (permalink)  
Antiguo 25/10/2009, 22:15
Avatar de buzu  
Fecha de Ingreso: octubre-2006
Ubicación: San Francisco, CA
Mensajes: 2.168
Antigüedad: 17 años, 6 meses
Puntos: 122
Respuesta: mostar DIV y ocultar el resto de DIV's

cada vez que usas style, ya sea para cambiar el color de letra, de fondo, el tamaño etc.. la pagina sufre un proceso de re-dibujado y cada vez que eso pasa el navegador tiene que hacer, entre otras cosas, cálculos para saber como representar la página. Es ahí precisamente donde esta el problema. Si todo lo haces con una clase, el navegador simplemente agrega la clase y hace el los cálculos solo una vez. Eso es a grandes rasgos, claro que ya investigando un poco más puedes encontrar más info al respecto y en base a eso hacer tus decisiones. Yo simplemente sugiero que style se use lo menos posible y que se evite su uso siempre que se pueda.
__________________
twitter: @imbuzu
  #7 (permalink)  
Antiguo 26/10/2009, 20:19
Avatar de ElJavista
Colaborador
 
Fecha de Ingreso: marzo-2007
Ubicación: Lima Perú
Mensajes: 2.231
Antigüedad: 17 años, 2 meses
Puntos: 67
Respuesta: mostar DIV y ocultar el resto de DIV's

Genial, una explicación sencilla y clara. Gracias por tus sugerencias.
  #8 (permalink)  
Antiguo 26/10/2009, 21:52
Avatar de buzu  
Fecha de Ingreso: octubre-2006
Ubicación: San Francisco, CA
Mensajes: 2.168
Antigüedad: 17 años, 6 meses
Puntos: 122
Respuesta: mostar DIV y ocultar el resto de DIV's

Para eso estamos en el for...
__________________
twitter: @imbuzu
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 09:23.