Avatar billede graugart Nybegynder
11. november 2004 - 13:48 Der er 16 kommentarer og
1 løsning

En udfordring: Dynamisk skifte css klasse på hver anden <tr>

Her er en lidt tricky opgave jeg håber nogle kan hjælpe med :)

Jeg har noget HTML der med en struktur der ser sådan her ud:

---------
<tr>
    <td>Head</td>
</tr>                                               
<tr>
    <td>1</td>
</tr>                                                               
<tr>
    <td>2</td>
</tr>   
                               
<tr>
    <td>3</td>
</tr>                                       
<tr>
    <td>4</td>
</tr>   
---------

Jeg har ingen kontrol over html'en så den kan ikke ændres. Der kan være genereret et vilkårligt antal rækker.

Udfordringen er så, at jeg skal lave et javascript der på en eller anden måde løber igennem alle <tr> tags i tabellen og sætter en css class på den (fx this.className = 'RowOdd';).

Dvs. at jeg kan style hver anden række med en klasse (i tabellen oven over bliver det så række 2+4 eller 1+3).

Jeg er ikke en javascript-haj så jeg håber nogle kan hjælpe med hvordan jeg løser dette??
Avatar billede graugart Nybegynder
11. november 2004 - 13:53 #1
Måske jeg lige skal nævne at jeg godt kan sætte et id på tabellen, men ikke et unikt id på hver tr/td
Avatar billede olebole Juniormester
11. november 2004 - 13:55 #2
<ole>

function setClass() {
    var tbl = document.getElementById(TABLE_ID);
    var aTR = tbl.getElementsdByTagName;
    for (i=0; i<aTR.length; i++) {
        if (1%2) aTR[i].className = "minKlasse";
    }
}
window.onload = setClass;

</mvh
</bole>
Avatar billede olebole Juniormester
11. november 2004 - 13:55 #3
Ooooops ... :)

var aTR = tbl.getElementsdByTagName("TR");
Avatar billede olebole Juniormester
11. november 2004 - 13:57 #4
... og naturligvis:

function setClass() {
    var tbl = document.getElementById(TABLE_ID);
    var aTR = tbl.getElementsdByTagName("TR");
    for (i=0; i<aTR.length; i++) {
        if (1%2) aTR[i].className = "minKlasse";
        else aTR[i].className = "minAndenKlasse";
    }
}
window.onload = setClass;

... hvis der skal alterneres mellem to klasser
Avatar billede olebole Juniormester
11. november 2004 - 13:58 #5
Damned ... endnu en fejl  :o|

if (i%2) aTR[i].className = "minKlasse";
Avatar billede thomas_yde Nybegynder
11. november 2004 - 13:58 #6
Kan du sætte en class på dine TR ?
så kan du lave det med CSS:
<tr class="DarkLight")>


TR.DarkLight{
background-color:expression(this.rowIndex%2==0?"#e5dac2":"#faf5e7");
}
Avatar billede thomas_yde Nybegynder
11. november 2004 - 14:00 #7
men olebole's eksempel er nu også meget fint :)
Avatar billede thomas_yde Nybegynder
11. november 2004 - 14:01 #8
Du kan jo samle de 2 eksempler og bruge olebole's eksempel til at smide en class på den og så bruge mit eksempel så behøves du kun en klasse. Det er lidt nemmere at håndtere.
Avatar billede graugart Nybegynder
11. november 2004 - 14:03 #9
Super nice allesammen, det virker perfekt med javascript funktionen. MANGE TAK!!

Er der nogle der vil have nogle point? :)
Avatar billede thomas_yde Nybegynder
11. november 2004 - 14:04 #10
Det er oles. Når du bruger hans eksempel :P

Den gamle mand fortjener det *grins*
Avatar billede olebole Juniormester
11. november 2004 - 14:08 #11
Tak for points  ;o)
Thomas, dit er nu noget rigtig skidt ... no offence. For det første virker expressions i CSS kun i IE - og for det andet er det dræææææbende dårligt performende. Det bør undgåes for næsten enhver pris  :)
Avatar billede thomas_yde Nybegynder
11. november 2004 - 14:11 #12
Tak for tippet olebole :)
Det er nok lidt for sent for min boss, de har brugt det overalt i vores kode, men jeg vil da lave nogle test med at par tusinde rækker og se om ikke vi kan banke lidt perfomance ud af det.
Avatar billede olebole Juniormester
11. november 2004 - 14:22 #13
Hjææææælp ... det var dog en fæl grimmert!  =8-O

Jeg havde et fint link om DHTML-optimering, men MS har vist nedlagt den afdeling og/eller flyttet siden. Anyway, så var der to ting, de på det aller kraftigste frarådede:
1. At bruge CSS-expressions
2. At skifte klasser på elementer (ikke som her i spm'et, men f.eks. skifte klasse på mouse-events).

Sagen er, at når du skifter en klasse, skal browseren spytte et nyt DOM-træ ud for hele dokumentet - som skal parses, hvergang det sker.
Det samme gælder expressions - bortset fra, at der fyrer du et uendeligt antal DOM-træer af i én lang smøre. Hvergang en property i dokumentet ændres, sker det.

Faktisk er det vanskeligt at finde på noget, der bruger mere ligegyldig CPU-kraft og RAM ...... det skulle da lige være en uendelig løkke  :)
Avatar billede thomas_yde Nybegynder
11. november 2004 - 14:50 #14
hej Ole kan du prøve at se på det her.
Jeg har prøvet at lave 2 test cases, meget simple:

Bare til at måle performance bruger jeg 2 dates og alerter dem:

*******
MED CSS Expression

<HTML>
<HEAD>
<META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">
<TITLE></TITLE>
</HEAD>
<style>
    TR.DarkLight{
        background-color:expression(this.rowIndex%2==0?"#e5dac2":"#faf5e7");
    }
</style>
<script>
    function buildtestcase(){
        var startdate = new Date();
        htmlOutput = "<table id=\'id_table\'>";
        for(i=0;i<2000;i++){
            htmlOutput += "<tr class=\"DarkLight\"><td style=\"width:200px;\">"+i+"</td></tr>"
        }
        htmlOutput += "</table>";
        document.getElementById("divTest").innerHTML = htmlOutput;
        var stopdate = new Date();
        alert(stopdate - startdate);
    }
window.onload = buildtestcase;
</script>

<BODY>
<script>
   
</script>
<P>&nbsp;</P>
<div id="divTest"></div>
</BODY>
</HTML>


********
MED JAVASCRIPT

<HTML>
<HEAD>
<META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">
<TITLE></TITLE>
</HEAD>
<style>
    .darklight{
        background-Color:#e5dac2;
    }
    .darklightodd{
        background-Color:#faf5e7;
    }
</style>
<script>
    function initpage(){
        var startdate = new Date();
        buildtestcase();   
        makeDesign();
        var stopdate = new Date();
        alert(stopdate - startdate);
    }   
    function makeDesign(){
        var objTable = document.getElementById("id_table")
        var array_tr = objTable.getElementsByTagName("TR")
        for(i=0;i<array_tr.length;i++){
            if(i%2==0){
                array_tr[i].className="darklight";
            }
            else{
                array_tr[i].className="darklightodd";
            }
        }
    }   
    function buildtestcase(){
        htmlOutput = "<table id=\'id_table\'>";
        for(i=0;i<2000;i++){
            htmlOutput += "<tr><td style=\"width:200px;\">"+i+"</td></tr>"
        }
        htmlOutput += "</table>";
        document.getElementById("divTest").innerHTML = htmlOutput;
    }
   
window.onload = initpage;
</script>

<BODY>
<P>&nbsp;</P>
<div id="divTest"></div>
</BODY>
</HTML>



Jeg synes ikke performance er så dårlig igen, kan du se om der er noget der gør at javascript siden performer dårligere end css ?
Avatar billede olebole Juniormester
11. november 2004 - 15:04 #15
Jeg behøver ikke at teste, for jeg ved, hvad der sker 'nedenunder'. Om du tror på mig, må du sådan set selvom, men jeg er helt på linie med andre, der lever af at kode - og som ved, hvad der sker. Expressions performer elendigt. That's it 'n' that's that  :)
Avatar billede thomas_yde Nybegynder
11. november 2004 - 15:09 #16
Jeg tror på dig, det var ren interesse jeg ville teste det, det var bare for at se hvormeget den egentlig performer dårligere.
Men det må være min kode der performer ringe så.

Tak for tippet endnu engang.
Avatar billede olebole Juniormester
11. november 2004 - 15:41 #17
... anytime  ;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