Avatar billede cybermaster Nybegynder
24. januar 2005 - 18:35 Der er 11 kommentarer og
2 løsninger

Skirft baggrunds farve i celler

Hej med jer, jeg har brug for en hånd til at kække denne nød...

i tabbel neden for er der 10 celler. Når man holder musen over celle fem skal celle 0 - 5 skifte baggrundsfarve. Holder man musen over celle 9 skal celle 0 - 9 skifte. holder man musen over celle 0 er det kun den der skal skifte. så der skal skiftes frem og tilbage mellem farverne.

<table border="1" width="200" cellspacing="0" cellpadding="0" id="table1">
    <tr>
        <td>0</td>
        <td>1</td>
        <td>2</td>
        <td>3</td>
        <td>4</td>
        <td>5</td>
        <td>6</td>
        <td>7</td>
        <td>8</td>
        <td>9</td>
    </tr>
</table>
Avatar billede baitianlong Nybegynder
24. januar 2005 - 19:40 #1
Sådan her :)

<script>
function skiftFarve(nummer) {
for(i=0;i<10;i++) {
  document.getElementById("celle"+i).style.backgroundColor="#FFFFFF";
}
for(i2=0;i2<=nummer;i2++) {
  document.getElementById("celle"+i2).style.backgroundColor="#CC00FF";
}
}
</script> 
<table border="1" width="200" cellspacing="0" cellpadding="0" id="table1">
    <tr>
        <td id="celle0" onmouseover="skiftFarve(0);">0</td>
        <td id="celle1" onmouseover="skiftFarve(1);">1</td>
        <td id="celle2" onmouseover="skiftFarve(2);">2</td>
        <td id="celle3" onmouseover="skiftFarve(3);">3</td>
        <td id="celle4" onmouseover="skiftFarve(4);">4</td>
        <td id="celle5" onmouseover="skiftFarve(5);">5</td>
        <td id="celle6" onmouseover="skiftFarve(6);">6</td>
        <td id="celle7" onmouseover="skiftFarve(7);">7</td>
        <td id="celle8" onmouseover="skiftFarve(8);">8</td>
        <td id="celle9" onmouseover="skiftFarve(9);">9</td>
    </tr>
</table>
Avatar billede softspot Forsker
24. januar 2005 - 23:29 #2
Nedenstående (MSIE og Opera - so far):


<html>

<head>
    <title>tabelcelle farveskifter</title>
    <script language="javascript">
        function markedColor(evt)
        {
           
            var element = (!evt.srcElement) ? evt.target : evt.srcElement;
            if(element)
            {
               
                if(element.tagName == "TD")
                {
                    var endCell = element.cellIndex;
                    var parentRow = element.parentElement;
                    for(var i = 0; i <= endCell; i++)
                    {
                        parentRow.cells[i].style.backgroundColor = "yellow";
                    }
                   
                    for(var i = endCell + 1; i < parentRow.cells.length; i++)
                    {
                        parentRow.cells[i].style.backgroundColor = "";
                    }
                }
            }
            return true;
        }
       
        function normalColor(evt)
        {
            var element = (!evt.srcElement) ? evt.target : evt.srcElement;
               
            if(element)
            {
                if(element.tagName == "TD")
                {
                    var parentRow = element.parentElement;
                    for(var i = 0; i < parentRow.cells.length; i++)
                    {
                        parentRow.cells[i].style.backgroundColor = "";
                    }
                }
            }
            return true;
        }
    </script>
</head>

<body>

<table width="100%" onmouseover="markedColor(event)" onmouseout="normalColor(event)">
  <tr>
    <td>1&nbsp;</td>
    <td>2&nbsp;</td>
    <td>3&nbsp;</td>
    <td>4&nbsp;</td>
    <td>5&nbsp;</td>
    <td>6&nbsp;</td>
    <td>7&nbsp;</td>
    <td>8&nbsp;</td>
    <td>9&nbsp;</td>
  </tr>
  <tr>
    <td>1&nbsp;</td>
    <td>2&nbsp;</td>
    <td>3&nbsp;</td>
    <td>4&nbsp;</td>
    <td>5&nbsp;</td>
    <td>6&nbsp;</td>
    <td>7&nbsp;</td>
    <td>8&nbsp;</td>
    <td>9&nbsp;</td>
  </tr>
</table>

</body>

</html>
Avatar billede olebole Juniormester
25. januar 2005 - 03:02 #3
<ole>

softspot >> Ja, som du nok har opdaget, så er event-objektet ikke af samme type i Moz og IE  ;o)
Denne løsning gør brug af property'en 'TD_ELEMENT.cellIndex', der returnerer cellens nummer i dens egen række:


<script type="text/JavaScript">
var actRow = timer = null;
function initMouseEvents(tbl) {
    tbl.onmouseover = colorTDs;
    tbl.onmouseout = function(){timer=setTimeout("deColorTR()",100)};
}
function colorTDs(e) {
    var srcElm = parElm = aTD = null;
    if (timer) clearTimeout(timer);
    srcElm = (window.event)? window.event.srcElement : e.target;
    if (srcElm.tagName=="TD") {
        parElm = srcElm.parentNode;
        if (actRow && actRow!=parElm) deColorTR();
        aTD = srcElm.parentNode.getElementsByTagName("td");
        for (i=0; i<aTD.length; i++) {
            aTD[i].style.backgroundColor = (i<=srcElm.cellIndex)? "red" : "";
        }
        actRow = parElm;
    }
}
function deColorTR() {
    var aTD = actRow.getElementsByTagName("td");
    for (i=0; i<aTD.length; i++) aTD[i].style.backgroundColor = "";
    actRow = null;
}
</script>

<table width="100%" onmouseover="initMouseEvents(this)">
  <tr>
    <td>1&nbsp;</td>
    <td>2&nbsp;</td>
    <td>3&nbsp;</td>
    <td>4&nbsp;</td>
    <td>5&nbsp;</td>
    <td>6&nbsp;</td>
    <td>7&nbsp;</td>
    <td>8&nbsp;</td>
    <td>9&nbsp;</td>
  </tr>
  <tr>
    <td>1&nbsp;</td>
    <td>2&nbsp;</td>
    <td>3&nbsp;</td>
    <td>4&nbsp;</td>
    <td>5&nbsp;</td>
    <td>6&nbsp;</td>
    <td>7&nbsp;</td>
    <td>8&nbsp;</td>
    <td>9&nbsp;</td>
  </tr>
</table>

/mvh
</bole>
Avatar billede olebole Juniormester
25. januar 2005 - 03:08 #4
Som du kan se, er den heller helt så 'grådig'. Vi sletter kun en hel række cellers baggrundsfarve, når vi skifter række eller forlader tabellen helt.

Ellers kører vi blot den enkelte række igennem én gang ved hver mouseover - farver cellerne hen til den aktuelle og sletter farven i resten  ;o)
Avatar billede cybermaster Nybegynder
25. januar 2005 - 13:34 #5
Hej med jer, det ser jo ud til de alle er perfekte, kan ikke gennem skue hvilken en af den der er bedst... kan i for tælle mig det :-)
Avatar billede baitianlong Nybegynder
25. januar 2005 - 15:51 #6
olebole kan sikkert komme med en længere forklaring på hvorfor min version ikke er perfekt, MEN DET ER DEN !! :P ha ha
Avatar billede olebole Juniormester
25. januar 2005 - 19:00 #7
Jamen, de er helt rigtigt alle gangbare ... men der *er* forskel, alligevel (here it comes, legende ... hehe):

Legende's er helt korrekt, men der skal skrives en masse HTML-kode, der ikke er nødvendig i en mere generisk løsning, som softspot's og min.
Samtidig låses man fast i et bestemt antal celler - og den gennemløber rækken to gange, når celler skal farves, hvilket ikke er nødvendigt.

softspot's virker kun i IE og Opera og løber også rækken igennem to gange, når der skal farves celler.

Min løsning virker under alle moderne browsere (alle browsere, der understøtter W3C's DOM) - og er optimeret til kun at gennemløbe det nødvendige antal celler én gang ved farveskift. Det giver bedre performance og mindre belastning på CPU og RAM.

Jeg vil derfor helt klart anbefale min egen ... men vil hellere end gerne dele points ligeligt med de andre to  ;o)
Avatar billede olebole Juniormester
25. januar 2005 - 19:01 #8
Nå, der var allerede accepteret  :)
Avatar billede baitianlong Nybegynder
25. januar 2005 - 19:31 #9
Nå... Men nu har jeg da omskrevet min version en lille smule. Så løber vi kun igennem 1 gang, og der skal skrives meget lidt kode :)

<script>
function skiftFarve(nummer) {
for(i=0;i<10;i++) {
  if(i<=nummer) document.getElementById("celle"+i).style.backgroundColor="#CC00FF";
  else document.getElementById("celle"+i).style.backgroundColor="#FFFFFF";
}
}
</script> 
<table border="1" width="200" cellspacing="0" cellpadding="0" id="table1">
    <tr>
<script>
for(i=0;i<10;i++) document.write('<td id="celle'+i+'" onmouseover="skiftFarve('+i+');">'+i+'</td>');
</script>
    </tr>
</table>

:)
Avatar billede baitianlong Nybegynder
25. januar 2005 - 19:34 #10
Du er smuk her Ole: "Jeg vil derfor helt klart anbefale min egen " (hvem vil ikke det?) :PPP

P.S. Jeg har respekten, og ved du er nede med det :)
Avatar billede baitianlong Nybegynder
25. januar 2005 - 19:35 #11
...synes i øvrigt også at jeg har valgt den bedste farve - ha ha ha :P
Avatar billede olebole Juniormester
25. januar 2005 - 19:43 #12
Samme mængde HTML skal udskrives - og at lade klienten udskrive det, hjælper ikke ligefrem på dennes performance. Farven er dog ganske køn  ;o)

Med fare for at lyde højrøvet: Jeg valgte min egen, fordi den er bedst. Havde jeg ikke kunnet forbedre de eksisterende, havde jeg ikke skrevet den.

- og den er stadig bedst  ;D
Avatar billede baitianlong Nybegynder
25. januar 2005 - 19:48 #13
Den er smuk :)

Jeg blev lidt rørt da jeg læste den, men you know... "Hvor gærdet er lavest, ses legenden i firspring!"
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