Avatar billede karl-koder Nybegynder
13. august 2008 - 13:48 Der er 20 kommentarer og
1 løsning

display:none på div

Hejsa,

Jeg har følgende stump kode der sætter alle div's i en div til display = "none" ved at løbe dem igennem en loop :

var tag2
tag2 = document.getElementById("role_Container").getElementsByTagName("div");
for(var i = 0; i < tag2.length; i++)
{
    tag2[i].style.display = "none";
}

Som det ses finder jeg alle div's ved hjælp af getElementsByTagName og og sætter så display = "none" på disse div's.

Nu ligger landet sådan at jeg ikke skal skjule alle div's men kun dem i første led, som illustreret

<div id="role_Container">
    <div id="panel_Indstillinger">//skal skjules
        <div></div>//skal IKKE skjules
    </div>
    <div id="panel_Sikkerhed">//skal skjules
        <div></div>//skal IKKE skjules
    </div>
    <div id="panel_Sprog">//skal skjules
        <div></div>//skal IKKE skjules
    </div>
    <div id="panel_Moduler">//skal skjules
        <div></div>//skal IKKE skjules
    </div>
</div>

Altså skal div's i id="role_Container" skjules med ovenstående kode, men ikke de div's der ligger inden i.

Håber det er forståeligt ellers må i lige sige til ;o)
Avatar billede erikjacobsen Ekspert
13. august 2008 - 14:12 #1
Du kan give dem en dummy-class:  <div ... class="maagerneskjules">
Avatar billede erikjacobsen Ekspert
13. august 2008 - 14:13 #2
Og ellers den mere tekniske: du kan se om deres parent er lig med tag2.
Avatar billede erikjacobsen Ekspert
13. august 2008 - 14:14 #3
Nej, ikke tag2 - men om den er lig med document.getElementById("role_Container")
Avatar billede w13 Novice
13. august 2008 - 15:13 #4
Ja, jeg ville også gøre det, som Erikjacobsen foreslår.

Dvs.:

var im = document.getElementById("role_Container").getElementsByTagName("div");
for(var i = 0; i < im.length; i++){
    if(im[i].parentNode==document.getElementById("role_Container")){
        im[i].style.display = "none";
    }
}
Avatar billede mclemens Nybegynder
13. august 2008 - 16:38 #5
Eller måske fange childNodes til role_Container istedet for at
undersøge om det pågældende element har role_Container som parent.

(if(elms[i].nodeType==1){ er medtaget da mellemrummene i html strukturen for FF's vedkommende (og nok også andre browsere) gør at der er tekstelementer imellem div elementerne.)

<script type="text/javascript">
function hide(){
  i=document.getElementById("role_Container").childNodes;
  for(j=0;j<i.length;j++)if(i[j].nodeType==1){
    i[j].style.display="none";
  }
}
</script>

<b onclick="hide();">Skjul</b><br>
Avatar billede w13 Novice
13. august 2008 - 16:47 #6
Ja, det er nok at foretrække. =)
Avatar billede karl-koder Nybegynder
13. august 2008 - 21:57 #7
Ok den første erikjacobsen og w13 skrev er testet og virker fint, den mclemens skriver får jeg lige testet i morgen, men den giver jo sikkert samme udfald ;o)

vil den sidste være bedre at bruge og hvorfor ?
Avatar billede mclemens Nybegynder
13. august 2008 - 22:21 #8
Ja det synes jeg, lad os sige vi kigger på en html struktur ála:

<div>
<div> <div></div> </div>
<div> <div></div> </div>
<div> <div></div> </div>
<div> <div></div> </div>
</div>

Så skal den første checke 8 div elementer, mens den sidste kun skal checke
4 elementer (forudsat at det er IE og ikke f.eks. FF der tæller de ovennævnte
textnodes). Dertil skal den første for hvert af de 8 div elementer gribe fat
i parent div elementet for at checke om det var ligmed hoved div elementet, mens
dette ikke er nødvendigt i den sidste udgave (da vi jo gennemløber childNodes).

Havde html strukturen været med 4 div elementer inden i de første div elementer:

<div>
<div> <div></div> <div></div> <div></div> <div></div> </div>
<div> <div></div> <div></div> <div></div> <div></div> </div>
<div> <div></div> <div></div> <div></div> <div></div> </div>
<div> <div></div> <div></div> <div></div> <div></div> </div>
</div>

Var "gennemløbs fordelingen"
- For den første løsning: 20 div gennemløb
samt check på alle div's parent vs. hoved div.
- For den anden løsning: 4 div gennemløb (plus
evt. de textNodes hvis det er en browser der
tæller textNodes med)

textNodes detaljen kan selvfølgelig slettes hvis
markup'en var samlet ... så kunne scriptet forkortes til:

  i=document.getElementById("role_Container").childNodes;
  for(j=0;j<i.length;j++)i[j].style.display="none";

Sidste fordel er selvfølgelig også at den sidste med eller
uden textNode checket også fylder noget mindre end det første...
Avatar billede olebole Juniormester
14. august 2008 - 00:18 #9
<ole>

- og jeg kan ikke lade være med at spørge: Hvorfor gemme dem i et loop? Ofte spørger folk om den slags, når de ønsker skiftevis at vise et af flere div.

Er det tilfældet, lægger du bare det viste div i en global variabel. Hvergang du vil vise et nyt div, skjuler du det div, som ligger i variablen - viser det nye div - og lægger det i variablen

/mvh
</bole>
Avatar billede roenving Novice
14. august 2008 - 00:21 #10
-- og også jeg ville principielt foretrække childNodes-modellen ...

-- jeg har dog svært ved at forestille mig en realistisk mark-up, hvor det virkelig ville gøre en forskel !-)
Avatar billede olebole Juniormester
14. august 2008 - 00:21 #11
Det kunne være noget i stil med:

var oVisDiv = null;
function showMyDiv(sID) { // sID => id'et på det div, som skal vises
    if (oVisDiv) oVisDiv.style.display = "none";
    oVisDiv = document.getElementById(sID);
    oVisDiv.style.display = "block";
}
Avatar billede olebole Juniormester
14. august 2008 - 00:32 #12
Til gengæld opnås ofte en ikke uvæsentlig performance forbedring, når et alm. for loop vendes. F.eks:
    i=document.getElementById("role_Container").childNodes;
    for (j=i.length-1; j>=0; j--) i[j].style.display="none";
Avatar billede olebole Juniormester
14. august 2008 - 00:40 #13
- og endnu hurtigere er:
    i=document.getElementById("role_Container").childNodes;
    var j = i.length-1;
    do i[j].style.display="none";
    while(j--);

- men med mindre, der er tale om en større struktur, vil det, som roenving antyder, næppe være af betydning  ;o)
Avatar billede karl-koder Nybegynder
14. august 2008 - 08:36 #14
Det drejer som at jeg har lavet en række faneblade/tabs. Når så jeg klikker på et af disse fanablade skal den tilhørende div vises, samtidig med at fanen gøres aktiv.

Nu har jeg testet alle forslag og både w13 og mclemens virker fint. olebole's virker tildels, da jeg har sat første tab og og tilhørende div til at være aktiv/synlig når sidens loades, ja så sker der det at når jeg klikker på en anden fane, så forbliver første fane, samt dennes div aktiv sammen med den fane jeg klikker på. Og det er denne jeg taler om :

var oVisDiv = null;
function showMyDiv(sID) { // sID => id'et på det div, som skal vises
    if (oVisDiv) oVisDiv.style.display = "none";
    oVisDiv = document.getElementById(sID);
    oVisDiv.style.display = "block";
}

hvordan løser jeg det ?
Avatar billede olebole Juniormester
14. august 2008 - 21:17 #15
Du bør undlade at vise nogen fra start, men skrive:

window.onload = function(){
    showMyDiv("panel_Indstillinger");
}
Avatar billede karl-koder Nybegynder
15. august 2008 - 12:00 #16
Super tak for det og smid nogle svar så kan i dele ;o)
Avatar billede mclemens Nybegynder
15. august 2008 - 12:32 #17
Springer over (Ole's er mest fornuftigt).
Avatar billede w13 Novice
15. august 2008 - 12:37 #18
Heller ikke til mig. =)
Avatar billede erikjacobsen Ekspert
15. august 2008 - 14:00 #19
Nej tak.
Avatar billede olebole Juniormester
16. august 2008 - 23:51 #20
Jamen, så vil jeg da lægge et svar  =)
Avatar billede olebole Juniormester
16. august 2008 - 23:55 #21
Der er en ny 'mode' igang omkring JS, som går udpå at rense det globale scope så meget som muligt for 'løse' variabler. Det kan der være gode grunde til, selvom det ofte løber lidt løbsk  =)
Hører du til den 'sekt', kunne du også skrive:

function showMyDiv(sID) { // sID => id'et på det div, som skal vises
    if (showMyDiv.oVisDiv) showMyDiv.oVisDiv.style.display = "none";
    showMyDiv.oVisDiv = document.getElementById(sID);
    showMyDiv.oVisDiv.style.display = "block";
}

Så lægger du i stedet variablen som property på funktionen. Pick your choise  =)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester