Avatar billede bongo20 Nybegynder
08. maj 2003 - 21:53 Der er 14 kommentarer og
1 løsning

onclick="this.style.background =

Jeg har en tabel med 50 rækker, som hver indeholder en masse checkboxe.

Jeg vil gerne vise brugeren hvilken række han er kommet til hele tiden, ved at lave rækkens farve om.

Det virker fint med:

onclick="java script: this.style.background = '#E6E6E6'"

Nu er den række grå, men når jeg så går videre til næste række skal rækken ovenover tilbage til den "gamle" farve.

Jeg har prøvet det med onclick på hele tabellen som giver hele formen en anden farve:

document.frmMain.style.background = "#FFFFFF"

Dette laver hele formen hvid,..MEN desværre IKKE den række som lige har fået en anden farve....

Kender nogen en løsning på mit problem ??

På forhånd tak :o)
Avatar billede =maddog= Nybegynder
08. maj 2003 - 22:48 #1
<script>
var select;
</script>
...
<td .. onclick="if(select)select.style.background='#ffffff';this.style.background='#e6e6e6';select=this;" ..>
Avatar billede olebole Juniormester
08. maj 2003 - 22:50 #2
<ole>

For det første må du aldrig bruge 'java script:' i en event-handler.
Du kan jo gøre noget à la dette:

<script type="text/JavaScript">
var oldCol = actTR = false;
function setTR(tr) {
  if (actTR) actTR.style.backgroundColor = oldCol;
  oldCol = tr.style.backgroundColor;
  tr.style.backgroundColor = "#ff0000";
  actTR = tr;
}
</script>

Så kan du altid kalde med:
<tr onclick="setTR(this)" style="background-color:#ffffff">

/mvh
</bole>
Avatar billede =maddog= Nybegynder
08. maj 2003 - 22:53 #3
:D
Avatar billede olebole Juniormester
08. maj 2003 - 22:53 #4
.... og hvad angår formen, så kan du jo også bruge 'actTR' og 'oldCol'  :)
Det er vigtigt, at du sætter inline-style på hver række. Ellers kan du ikke aflæse den og sætte 'oldCol'
Avatar billede olebole Juniormester
08. maj 2003 - 22:54 #5
Din gale hund ...!  ;oD
Avatar billede =maddog= Nybegynder
08. maj 2003 - 22:57 #6
well. det er så meget "arbejde" at det nok formelt set er bedst at lave en funktion til det. med så megen javascript inde i selve html koden bliver det meget hurtigt uoverskueligt og tidsrøvende at vedligeholde.
Avatar billede olebole Juniormester
08. maj 2003 - 23:06 #7
Dette skulle kunne gøre det hele 'automatisk':

<script type="text/JavaScript">
var d=document;
function gE(id){return d.getElementById(id)}
function gA(o,tN){return o.getElementsByTagName(tN)}
var oldCol = actTR = false;
function setTR(tr) {
  if (actTR) actTR.style.backgroundColor = oldCol;
  oldCol = tr.style.backgroundColor;
  tr.style.backgroundColor = "#ff0000";
  actTR = tr;
}
function setForm(f) {
    if (actTR) actTR.style.backgroundColor = oldCol;
    f.style.backgroundColor = "#ffffff";
    actTR = false;
}
function initTBL() {
    var aTR = gA( gE("minTBL"), "TR" );
    for (i=0; i<aTR.length; i++) {
        aTR[i].style.backgroundColor = "#dedede";
        aTR[i].onclick = function() {
            setTR(this);
        }
    }
}
window.onload = initTBL;
</script>

Din tabel med de omtalte rækker skal så have id="minTBL" - og formen skal have:
  <form onclick="setForm(this)" ... osv ... >

Nu bliver der automatisk sat baggrundsfarve på alle rækker (#dedede) og lagt onclick-handler på dem også  :)
/mvh
Avatar billede bongo20 Nybegynder
09. maj 2003 - 10:04 #8
Jeg forstår slet ikke din kode, men jeg har en kode her som farver aller rækker i mine tabeller nøjagtig som jeg gerne vil:

<script language = "javascript">
function ColorDocument()
{
  for (i=0; i<document.all.length; i++){
    if (document.all.item(i).id == "tr"){
            document.all.item(i).style.background = "#FFFFFF";            }
    }
}
</script>

Probelmet her er at det tager næsten 2 sekunder at afvikle den kode,..hvordan kan det være?
Avatar billede =maddog= Nybegynder
09. maj 2003 - 10:13 #9
1) style.background har flere omkostninger end style.backgroundColor
2) document.all har flere omkostninger end document.getElementById/document.getElementByTagName (du skal igennem hele dokumentet med document.all)
Avatar billede bongo20 Nybegynder
09. maj 2003 - 10:43 #10
=maddog= Jeg har lige prøvet det med getElementById, men det tager stadig lige lang tid.
Der er 1096 elementer i mit dokument, det kan vel ikke passe at det skal tage mere end et kvart sekund at løbe det igennem og ændre farve !!?? eller hvad ?
Avatar billede =maddog= Nybegynder
09. maj 2003 - 11:22 #11
<script language = "javascript">
function ColorDocument() {
    elms = document.getElementsByTagName("tr");
    for (i=0; i<elms.length; i++){
        if (elms.item(i).id == "tr"){
            elms.item(i).style.backgroundColor = "#FFFFFF";           
        }
    }
}
</script>
Avatar billede =maddog= Nybegynder
09. maj 2003 - 11:24 #12
hov. vent nu lige lidt. du har husket at id skal være unikt ikke?
<span id="s">span 1</span>
<span id="s">span 2</span>
er schtreng verboten.
Avatar billede olebole Juniormester
09. maj 2003 - 14:09 #13
Hehe .... det er jo næsten samme funktion, jeg har skrevet. Den tager bare længere tid  :o)

function initTBL() {
    var aTR = gA( gE("minTBL"), "TR" );
    for (i=0; i<aTR.length; i++) {
        aTR[i].style.backgroundColor = "#dedede";
        aTR[i].onclick = function() {
            setTR(this);
        }
    }
}

gA() og gE() er blot mine standard-wrappers, jeg bruger for ikke at skulle skrive så meget. Der står i virkeligheden:

function initTBL() {
    var tbl = document.getElementById("minTBL");
    var aTR = tbl.getElementsByTagName("TR");
    for (i=0; i<aTR.length; i++) {
        aTR[i].style.backgroundColor = "#dedede";
        aTR[i].onclick = function() {
            setTR(this);
        }
    }
}

Det burde gå hurtigere, da der ikke (unødigt) spørges, om elementet i TR-array'et er en TR.
Til gengæld bliver det naturligvis sløvet en anelse, da den også lægger den fornødne onclick-handler på TR'en.
Lægges den dog ikke på her, skal man til gengæld skrive den ud 1096 gange, hvilket bliver betydelig langsommere at få ned gennem 'hullet i himlen'  :)

Om der står #ffffff eller #dedede er nok ikke et problem at rette i  :)
/mvh
Avatar billede =maddog= Nybegynder
09. maj 2003 - 14:27 #14
document.getElementById og document.getElementByTagName er recursive funktioner der gennembladrer documentet og er derfor principielt set altid at foretrække for den iterative document.all når man har et valg. Forskellen skulle (i teorien i hvert fald) være særligt mærkbar med meget "dybe" dokumenter hvor tags ligger nestet i mange lag.
ByTagName har den fordel at den ved en eneste gennemgang ligger alle fundne elementer ned i en hukommelses-mæssigt meget effektiv Collection uden nogen grund til at indexere ind i den komplekse HTML struktur igen.
Avatar billede olebole Juniormester
09. maj 2003 - 14:38 #15
Netop ... derfor bruger jeg den  :)
Som du ser bladrer min ikke enggang hele TR-strukturen igennem - kun den pågældende tabels TR-struktur. Det går endnu hurtigere  ;o)

Jeg så dog forkert med hensyn til if'en. Der har du helt ret ... en id må under ingen omstændigheder findes i flere rækker. Man kan give den class="tr" og så (med min funktion incl. wrappers) skrive:

function initTBL() {
    var aTR = gA( gE("minTBL"), "TR" );
    for (i=0; i<aTR.length; i++) {
        if (aTR[i].className=="tr") {
            aTR[i].style.backgroundColor = "#dedede";
            aTR[i].onclick = function() {
                setTR(this);
            }
        }
    }
}

/mvh
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