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"; } }
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>
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)
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:
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:
- 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
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"; }
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";
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"; }
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 =)
Synes godt om
Ny brugerNybegynder
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.