Avatar billede danskweb Nybegynder
21. november 2006 - 17:17 Der er 12 kommentarer og
2 løsninger

Synkroniser checkbox

Forledes synkroisere jeg 2 checkboxe?
Således at når jeg sætter hak i den ene, sættes der automatisk hak i den anden.

<form action='' method='post'>
<input type='checkbox' name='1'>
<input type='checkbox' name='1'>
<input type='checkbox' name='2'>
<input type='checkbox' name='2'>
</form>

1 skulle gerne synkronisere med 1 og 2 med 2.
Avatar billede davidfossil Nybegynder
21. november 2006 - 20:15 #1
<script type="text/javascript">
function syncCheckBoxes()
{
  var siblings = document.getElementsByName(this.name);
  for (var i = 0; i < siblings.length; i++)
  {
    if (this != siblings[i])
    {
      siblings[i].checked = this.checked;
    }
  }
}
</script>

Og så en event handler på hver af dine checkboxes:

<input type='checkbox' name='1' onclick="syncCheckBoxes();">
Avatar billede davidfossil Nybegynder
21. november 2006 - 20:16 #2
Når du lige har testet at det virker (det håber jeg at det gør), kan du jo passende læse hver enkel linje af de korte script igennem og forstå det - det er temmelig simpelt :)
Avatar billede psykochicken Nybegynder
21. november 2006 - 22:20 #3
..jo simpelt er det, men virker bare ikke !-)
Prøv i stedet noget ala:

<script type="text/javascript">
function sync(chb){
  var elm = document.getElementsByName(chb.name);
  for (i=0,elmlen=elm.length;i<elmlen; i++){
    if(chb.checked){ elm[i].checked=true; }
    //else{ elm[i].checked=false; } //hvis markeringerne skal fjernes samtidigt
  }
}
</script>

<form>
<input type='checkbox' name='1' onclick="sync(this);">
<input type='checkbox' name='1' onclick="sync(this);">
<input type='checkbox' name='2' onclick="sync(this);">
<input type='checkbox' name='2' onclick="sync(this);">
</form>

/psc
Avatar billede davidfossil Nybegynder
21. november 2006 - 22:44 #4
Kan man ikke bruge this keywordet ved denne deklerative events? I så fald tager jeg den helt på min hat. Jeg sætter normalt ikke events på denne måde selv =\

Anyhow - den pæneste (og fejlrettede) variant af scriptet er nok denne:

<script type="text/javascript">
function syncCheckBoxes(elm)
{
  var siblings = document.getElementsByName(elm.name);
  for (var i = 0; i < siblings.length; i++)
  {
    siblings[i].checked = elm.checked;
  }
}
</script>

Og så en event handler på hver af dine checkboxes:

<input type='checkbox' name='1' onclick="syncCheckBoxes(this);">
Avatar billede psykochicken Nybegynder
21. november 2006 - 23:29 #5
..lille optimering:
for(i=0,siblen=sibling.length;i<siblen;i++)

;o)
Avatar billede davidfossil Nybegynder
22. november 2006 - 08:45 #6
Den havde jeg slet ikke set før - er det meningen at det skulle øge performance at gemme længden på arrayet i en variabel? Det forekommer mig meget mærkeligt at det skulle være tilfældet, men det er da muligt du har ret :)

Når vi nu er startet på flueknepperiet: Du deklarerer ikke variablerne i og siblen, hvilket imo er noget rod :p
Avatar billede danskweb Nybegynder
22. november 2006 - 10:17 #7
Hej begge :)
Jeg får følgende fejl "sibling is undefined"

Jeg gør følgende:

<script type="text/javascript">
function syncCheckBoxes(elm)
{
  var siblings = document.getElementsByName(elm.name);
  for(i=0,siblen=sibling.length;i<siblen;i++)
  {
    siblings[i].checked = elm.checked;
  }
}
</script>

    <input type="checkbox" name="1" onclick="syncCheckBoxes(this);">
    <input type="checkbox" name="1" onclick="syncCheckBoxes(this);">
    <input type="checkbox" name="2" onclick="syncCheckBoxes(this);">    <input type="checkbox" name="2" onclick="syncCheckBoxes(this);">
Avatar billede davidfossil Nybegynder
22. november 2006 - 10:31 #8
Det er fordi variablen hedder siblings - det skal lige rettes i fjerde linje af selve scriptet, hvis du vælger den variant.
Avatar billede olebole Juniormester
22. november 2006 - 14:51 #9
<ole>

En name-attribut kan ikke begynde med et tal  ;o)

/mvh
</bole>
Avatar billede psykochicken Nybegynder
22. november 2006 - 17:04 #10
davidfossil >> det er muligt det forekommer dig mærkeligt, men jo - den slipper for at regne siblings.length ud for hvert gennemløb (selv om der nok ikke er meget performance at øge lige her)!
Desuden var det ikke flueknepperi - det overlader jeg til de virkelige eksperter herinde. Det var blot en god vane jeg har har lært herinde, men velmente råd er jo heldigvis noget man kan vælge at tage imod, eller smide væk ;o)

/psc
Avatar billede davidfossil Nybegynder
23. november 2006 - 11:28 #11
olebole > haha, godt set :)

psykochicken > Jamen jeg takker mange gange for rådet :-) Var simpelthen ikke klar over at det "kostede" noget at spørge til length på et array, men med JavaScripts dynamiske karakter taget i betragting kan jeg godt se at der nok er noget om det. Havde det derimod været et mere typefast sprog (Java, C#) ville jeg da mene at længden på et array skulle være ligeså let at læse som værdien af en lokal int. Eller tager jeg helt fejl igen? Det er jo de små tricks der tæller... ;)
Avatar billede danskweb Nybegynder
25. november 2006 - 15:35 #12
Tak for svar + den ivrige debat. psykochicken du må meget gerne svare.
Avatar billede psykochicken Nybegynder
25. november 2006 - 15:49 #13
jo tak, men 100 point er for meget for sådan et spørgsmål. Smid 30 og behold resten selv ;o)
Avatar billede danskweb Nybegynder
04. december 2006 - 00:24 #14
Jeg var glad for diskutionen og deler glædeligt de 100 point mellem jer.
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