Avatar billede karl-koder Nybegynder
05. april 2008 - 17:49 Der er 19 kommentarer og
2 løsninger

Løbe list igennem og sætte attribute class ?

Hejsa,

jeg forsøger at løbe en liste igennem for at fjerne attribute class for så at sætte den på en bestemt. Min html er som følger :

<div id="tab-container">
    <div id="header-tab">
        <ul>
            <li runat="server" class="current" id="tab1"><a href="java script:void(0);" onclick="setActiveTab('tab1')">Forside</a></li>
            <li runat="server" id="tab2"><a href="java script:void(0);" onclick="setActiveTab('tab2')">System indstillinger</a></li>
            <li runat="server" id="tab3"><a href="java script:void(0);" onclick="setActiveTab('tab3')">Sprog indstillinger</a></li>
            <li runat="server" id="tab4"><a href="java script:void(0);" onclick="setActiveTab('tab4')">Moduler</a></li>
        </ul>
    </div>
</div>
<div id="tab-content">indhold</div>

Til det har jeg så forsøgt mig med noget javascript, som jeg ikke helt kan få til at spille :

function setActiveTab(tabId)
{
    var ulElement = document.getElementsByTagName("ul")
    if (ulElement.hasChildNodes)
    {
        for (var i=0; i<ulElement.childNodes.lenght; i++)
        {
            var liNode = ulElement.childNodes[i];
            if (liNode.nodeName.toLowerCase == "li")
            {
                var liClass = document.getElementsByTagNmae("li")
                liClass.setAttribute("class", "");
            }
        }
    }
    var activeTab = document.getElementById(tabId);
    activeTab.setAttribute("class", "current");
}

Er der en der kan hjælpe mig med det ?
Avatar billede roenving Novice
05. april 2008 - 17:55 #1
Bemærk s'et i getElementsByTagName, for du får en collection med elementer, når du bruger den, så prøv først at sætte et index på:

    var ulElement = document.getElementsByTagName("ul")[0];
Avatar billede karl-koder Nybegynder
05. april 2008 - 18:05 #2
Ok, det hjalp en smule på det, men det virker som om den springer hen over min

if (ulElement.hasChildNodes())
{
. . .
}

For den fjerner ikke class="current" på den, den er sat på. Men jeg får den fint sat med denne :

var activeTab = document.getElementById(tabId);
    activeTab.setAttribute("class", "current");

hvilket jo så blot gør at flere af mine tabs er aktive.
Avatar billede w13 Novice
05. april 2008 - 18:08 #3
Prøv med liClass.removeAttribute("class")
i stedet for liClass.setAttribute("class","")
Avatar billede karl-koder Nybegynder
05. april 2008 - 18:12 #4
Det hjælper heller ikke, jeg får stadigt blot sat class="current" på alle de tabs jeg klikker på
Avatar billede olebole Juniormester
05. april 2008 - 19:45 #5
<ole>

Du bør ikke bruge set-/getAttribute til CSS-klasser, før browserne understøtter et fælles interface. Du kan i stedet bruge den 'gamle' HTML-DOM:
    activeTab.className = "enEllerAndenKlasse";

Derudover performer det ofte meget skidt at sætte CSS-klasse på et element. Skift i stedet dets enkelte style properties  ;o)

/mvh
</bole>
Avatar billede karl-koder Nybegynder
05. april 2008 - 19:56 #6
Ok det vil jeg så lige kigge på, er der så noget jeg skal tage højde for der med hensyn til de forskellige browsere.

Vil liClass.style.color = "#000000" virke i alle browsere eller er der også forskel på IE og de andre i disse tilfælde ?

I det ovenstående har jeg fjernet den linie der tjekker om der er childNodes, men når jeg tjekker på længden af childnods med denne :

for (var i=0; i<ulElement.childNodes.lenght; i++)

ja så viser IE at der er 4 og FF at der er 9 hvordan løser jeg dette ?
Avatar billede olebole Juniormester
05. april 2008 - 19:56 #7
Der er et eksempel på, hvordan det kan gøres sidst i min artikel om arrays og objekter:
    http://www.eksperten.dk/artikler/227

Der er nogle uhensigtsmæssigheder i artiklen, men jeg har ikke tid til at rette den lige nu. At tale om associative arrays under JavaScript er faktisk noget vrøvl og konstruktionen:
    var aArray = new Array();
    aArray["noget"] = "Et eller andet";
    aArray["nogetAndet"] = "Et eller andet helt andet";

- bør undgås, da den 'opdrager' kodere til at tænke helt forkert! Heldigvis er jeg selv blevet klogere, siden jeg skrev artiklen  =)

Det, der sker, er ikke, at man opretter to elementer i array'et 'aArray'. I stedet sætter man to properties på JS-objektet, som implementerer arrayet 'aArray'. Man kunne ligeså godt have extended ethvert andet JS-object ... f.eks. et RegExp-, Date- eller Function-object.

Eksempel:
    var aArray = new Date();
    aArray["noget"] = "Et eller andet";
    aArray["nogetAndet"] = "Et eller andet helt andet";
    alert( aArray["noget"] );
    alert( aArray.noget );

Derfor bør man i stedet bruge den logiske konstruktion:
    var aArray = new Object();
    aArray["noget"] = "Et eller andet";
    aArray["nogetAndet"] = "Et eller andet helt andet";
    alert( aArray["noget"] );
    alert( aArray.noget );

Disse fejl er dog ikke ting, der ændrer ved noget i artiklens sidste eksempel  ;o)
Avatar billede olebole Juniormester
05. april 2008 - 19:58 #8
Løsningen på childNode problemet er vel:
    var aLi = ulElement.getElementsByTagName("li");
    for (var i=0; i<aLi.length; i++)
Avatar billede olebole Juniormester
05. april 2008 - 20:00 #9
- årsagen er, at FF tæller white-space (mellemrum og linjeskift) med som childNodes
Avatar billede olebole Juniormester
05. april 2008 - 20:04 #10
"... da den 'opdrager' kodere til at tænke helt forkert!" >> der findes _kun_ tal indekserede arrays i JavaScript! Associative arrays findes i andre sprog, men _ikke_ i JavaScript  ;o)

Der er vel at mærke intet ulovligt i at extende et JS-object, men det forplumrer sproget og forståelsen af det, når man lader, somom man bruger et streng indekseret array.
Avatar billede karl-koder Nybegynder
05. april 2008 - 20:13 #11
Ok takker for det og den artikel vil jeg lige læse igennem.

For at andre måske kan få glæde af det kommer her den løsning jeg fik til at virke, det er testet i IE 6 og FF 2 ;o)

function setActiveTab(tabId)
{
    var ulElement = document.getElementsByTagName("ul")[0]
    var aLi = ulElement.getElementsByTagName("li");
    for (var i=1; i<aLi.length+1; i++)
    {
        var liClass = document.getElementById("tab" + i)
        liClass.className = "";
    }
    var activeTab = document.getElementById("tab" + tabId);
    activeTab.className = "current";
}
Avatar billede karl-koder Nybegynder
05. april 2008 - 20:20 #12
Smid et svar olebole ;o)
Avatar billede olebole Juniormester
05. april 2008 - 21:47 #13
Det må vist primært være de andre, der deler points  =)
Avatar billede karl-koder Nybegynder
05. april 2008 - 22:14 #14
Well, du hjalp mig dog trodsalt på den rette vej så hvorfor skulle du ikke have nogle point ?
Avatar billede olebole Juniormester
06. april 2008 - 02:06 #15
Så lad os splitte. Læg et svar roenving og w13. Mens jeg så har de andre geeks samlet, må jeg hellere dementere kommentaren (05/04-2008 20:04:55). 'Nyeste forskning' viser en helt ny virkelighed (for undertegnede):
    I JavaScript er _alle_ arrays streng indekserede! ... ta' dén!  =8-O

Tjek lige det her ud i et dokument:

var a = ["en", 2, "tre"];
a.push(4);
a["4"] = "fem";

alert( a[2] + " :: " + a["2"] );

var b = [];
for (var x in a) {
    b.push("Key: " + x + " :: Value: " + a[x]);
    b.push("Key type: " + (typeof x) + " :: Value type: " + (typeof a[x]));
    b.push("-------------------------------------------");
}

alert(b.join("\n"));

Der er ikke noget nyt i, at Array er en extension af Object - tilføjet nogle metoder og en length property. Det nye for mig er, at alle indeks automatisk bliver konverteret til streng-properties på Array-objektet ... okaaaaaaay ...!

Det bliver vist snart til en ret voldsomt rettet artikel  :D
Avatar billede olebole Juniormester
06. april 2008 - 02:07 #16
- og det dér svar. Husk lige at vente på de to andre, så du kan dele mellem os  ;o)
Avatar billede olebole Juniormester
06. april 2008 - 02:17 #17
Internt er et JS-array altså et objekt med alm. streng properties. Det eksterne brackets-interface tager både strenge og tal som key/indeks. 'På indersiden' af brackets-interface'et bliver inputtet konverteret til en streng.

- et Object objekt kan jo nemlig godt have et tal i form af en streng som property  ;o)
Avatar billede karl-koder Nybegynder
06. april 2008 - 08:13 #18
06/04-2008 02:06:43 >>

Den blev sq noget langhåret for mig den der, men det er jo også stadigt meget nyt for mig det her javascript.

Jeg fik dog lavet min metode om så den benytter style istedet for class så den nu ser sådan her ud :

var tabLeft = {"background":"url(tab-left.png) no-repeat left top"};
var tabRight = {"background":"url(tab-right.png) no-repeat right top"};
var tabActiveLeft = { "backgroundImage" : "url(tab-left-active.gif)" };
var tabActiveRight = { "backgroundImage" : "url(tab-right-active.gif)" };

function setActiveTab(tabId, tabAction)
{
    var ulElement = document.getElementsByTagName("ul")[0]
    var aLi = ulElement.getElementsByTagName("li");
    for (var i=1; i<aLi.length+1; i++)
    {
        var liStyle = document.getElementById("liTab" + i)
        for (x in tabLeft){liStyle.style[x] = tabLeft[x];}
       
        var aStyle = document.getElementById("aTab" + i)
        for (x in tabRight){aStyle.style[x] = tabRight[x];}
    }
   
    //--- Sætter aktiv style på li tag af tab.
    var activeLeftTab = document.getElementById("liTab" + tabId);
    for (x in tabActiveLeft){activeLeftTab.style[x] = tabActiveLeft[x];}
   
    //--- Sætter active style på a tag af tab.
    var activeRightTab = document.getElementById("aTab" + tabId);
    for (x in tabActiveRight){activeRightTab.style[x] = tabActiveRight[x];}
}
Avatar billede roenving Novice
06. april 2008 - 13:57 #19
Jamen, så velbekomme '-)
Avatar billede roenving Novice
18. april 2008 - 00:55 #20
-- og tak for point ;~}
Avatar billede karl-koder Nybegynder
18. april 2008 - 08:29 #21
Det var så lidt ;o)
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