Ocultar div al mostrar otro

LR

Buenas, necesito un pelin de ayuda.

Como puedo hacer para que al mostrar un div, se me oculten todos los demas?

Tengo varios divs, con id numerico (me los genera un foreach) y quiero que solo pueda estar abierto 1.

Como puedo hacer esto?

Se como ocultar y como mostrar 1 a base de javascript con el display, pero no se como hacer para buscar todos los abiertos y cerrarlos.

Supongo que la cosa sera buscar un class y asignarle el mismo class a todos los divs para cerrar todos los que tengan ese class, pero sinceramente no tengo ni idea de si es asi o no.

Alguna ayuda? thx.

bLaKnI

Si usas jQuery? Mamadisimo.
Javascript a pelo? Algo mas rebuscado.

Supongamos:

<div id="d_1">
</div>
<div id="d_2">
</div>
<div id="d_3">
</div>
...
<div id="d_N">
</div>

Cuando se deben ocultar u mostrar? En un click por ejemplo en algun sitio? Check?
Supondré click en "algo".

jQuery:

$( "#algo" ).click(function(){

//te lo montas para preparar una variable con el numero del div a tratar. Tu sabrás como hacerlo, porque sabes como "activas" el hecho de ocultar.
//Supongamos que la tienes:

var num_div = .......

$( "div[id*=d_]" ).each(function(){

if( $(this).attr( "id" ) == 'd_'+num_div ){

$(this).show();

}else{

$(this).hide();

}

});

});

Por ejemplo. Hecho así de cabeza sin pensar mucho.
Tienes que ver donde clickas, o como activas el hecho de mostrar/ocultar.
Hay mas formas. Mas directas.
Con hasClass() o otros. O metiendolo todo en un DIV y hacer algo como $( "#div_padre > div" ) que seria todos los divs children del div contenedor (div_padre).
Etc... las opciones son limitadas, pero las hay a cantidades.

Si trabajas con javascript a pelo, tienes que tirar de "document.getElementByID( '...' )".

Y harias algo similar supongo:

function muestraUnoOcultaOtros(id, num_divs){

for(var i=0; i<num_divs; i++){
document.getElementById('d_'+i).visibility = 'hidden';
}

document.getElementById('d_'+id).visibility = 'visible';

}

O algo así.
Y claro, necesitas llamar la funcion en un "onclick" o algo así en algun punto, y como todo lo hacer via foreach, entiendo que mezclas con PHP, entonces en la llamada "onclick=muestraUnoOcultaOtros(x,y)", a X le darias el valor mediante PHP segun el div que quieres mostrar, y en Y, le darias una variable de tipo "contador" digamos segun las vueltas el foreach.

Hay mas maneras de hacerlo, pero así a botepronto, te presento estas.
Dime que te parece, y te tiro otro cable.
Saludos!

edit:

porcierto, si pasa por aqui Pollo o Beavis o alguien, a ver si haceis el puto favor de solucionar el parseado de strings de Media Vida, que algo como ) ", pero junto, provoca un smiley sin venir a cuento joder!

LR

esta noche lo probare, yo lo que tengo es esto:

javascript
llamada
NeB1

#3 la idea es buena, pero ya que usas jquery, yo de tí seguiría usandolo. Una opción muy sencilla de implementar lo que tu dices es cerrar todos los divs y despues abrir el que tu quieres..

Gasta un pelín más de recursos, pero es un pelín, porque si tienes 100 divs, de una forma cierras 99 y abres 1, de la otra forma cierras 100 y abres 1. Pero en cuanto a la implementación es super sencilla.

$('.objetoJustoDelanteDelDivACerrar').click(function(event){
   event.preventDefault();
   $('.toggleDivs').hide('slow',function(){
      $(this).next().show();
   })
});

/El event.preventDefault evita que se ejecute la accion por defecto del elemento html, en el caso de un <a> evita que se ejecute el hipervinculo/

Esto suponiendo una estructura del tipo:

<a href="#" class='objetoJustoDelanteDelDivACerrar'>loquesea</a>
<div class='toggleDivs'></div>
<a href="#" class='objetoJustoDelanteDelDivACerrar'>loquesea</a>
<div class='toggleDivs'></div>
<a href="#" class='objetoJustoDelanteDelDivACerrar'>loquesea</a>
<div class='toggleDivs'></div>
<a href="#" class='objetoJustoDelanteDelDivACerrar'>loquesea</a>
<div class='toggleDivs'></div>
<a href="#" class='objetoJustoDelanteDelDivACerrar'>loquesea</a>
<div class='toggleDivs'></div>

Pero esto ya es al gusto de cada uno.

/*************************************************************************/
Otra opción que está muy bien es esta:

<a class='esconderDiv' href="#div1">loquesea</a>
<a class='esconderDiv'  href="#div2">loquesea</a>
<a class='esconderDiv'  href="#div3">loquesea</a>

<div id="div1" class='toggleDivs'>

</div>
<div id="div2" class='toggleDivs'>

</div>
<div id="div3" class='toggleDivs'>

</div>[b]

<script>
    $('.esconderDiv').click(function(event){
        var divID= $(this).attr('href');
        event.preventDefault();
        $('.toggleDivs').hide('slow',function(){
            $(divID).show('slow'); //o fadeIn, o slideUp....
        });
    });
</script>[/b]

bLaKnI

La ultima es muy interesante.
Intercalandolos, tendrias hasta "anchors" que para el caso, podrian ir bien! :)

Pero yo soy muy purista, y que en una url se vea el #divX, no me mola.
Sabias que puedes añadir tus propios atributos a voluntad en cualquier tag tio?

Esto lo uso cacho y es genial para aplicaciones web potentes.
Evidentemente, cuando hablamos de "Aplicación Web", casi elidimos el concepto "validar" W3C. xD
Por eso los personal-tags, no validan, pero son cojonudos.

Luego puedes hacer cosas como:

<a id="lolazolink" href="..." title="..." atrA="..." atrB="..." ... atrn="..."> ... </a>

Y luego lo guapo es que con jQuery, puedes jugar tal que así:

...
var lol1 = $("#lolazolink").attr("atrA");
var lol2 = $("#lolazolink").attr("atrB");
var lol3 = $("#lolazolink").attr("atrC");
...
var loln = $("#lolazolink").attr("atrn");
...

Es decir, los tags en si mismo, se convierten en Objetos como aquel que dice.
Y claro, imaginate lo cojonudo que es, no tener que ir andando con "ids" combinados, que es lo tipico que hacemos:

id="numX_idPersona_calle_ciudad"

donde numX, idPersona, calle y ciudad son valores, quedando algo así:

id="45736_352_paralelo-42-44_Jerez"  (totalmente inventado... xDDDD)

Y entonces en jQuery (javascript) es cuando hacemos aquello de:

var id = $(...).attr("id");
var material = id.split("_");
var num = material[0];
var user = material[1];
var calle = material[2];
var ciudad = material[3];
...

Sabes?

De este modo podemos hacer algo tal que así:

<a id="lolazolink" href="..." title="..." num="45736" user="..." ciudad="Jerez" calle="paralelo-42-44"> ... </a>

Y luego en jQuery referirnos via "attr()" a cada uno de los campos!

Es cojonudo macho... ^^

ADORO jQUERY! :D

NeB1

#5 si lo sabía, sobretodo porque muchos plugins de jquery lo gastan, y el único pero es que no te valida despues, pero si eso no te importa (a mí desde luego no), avant!

LR

bueno y........ cuando nos van a poner una categoria "how to" para poder ir poniendo todo este tipo de cosas que luego no se buscan y se preguntan en 14012740141024 posts?

Como siempre, los putos amos ;) Me ha gustado la ultima opcion #4 seguramente es la que use.

A ver si de una vez me meto con mi tan querido javascript y deja de ser una asignatura pendiente xDDD

CoDe_WaR

Joder que casualidad, justamente la semana pasada realice algo similar de manera muy básica.

La parte que te interesa seria asi: (similar a la tuya pero trabajando con classnames)

function ocultatodo(noquieroseryo) {
	estotaabierto =  document.getElementsByTagName("div");
	for(var i=0; i<estotaabierto.length; i++) {
		if( estotaabierto[i].className=="visible" ){estotaabierto[i].className="oculto";}
		}
	document.getElementById(noquieroseryo).className="visible";

Vamos, busca todos los div y los que tengan la clase "visible" los pasa a "oculta".

codigo entero pa ver como rula

Usuarios habituales

  • CoDe_WaR
  • LR
  • NeB1
  • bLaKnI