Avatar billede donslund Nybegynder
30. marts 2006 - 17:40 Der er 25 kommentarer og
1 løsning

Fange checkede checkboxe onLoad

Jeg har nogle checkbokse, hvoraf nogle afkrydses automatisk udfra et indhold i en database.
Dette sker jo serverside. Når siden så er kommet clietnside har jeg brug for, at finde ud af hvilke der er afkrydset og smide dem i et text-felt i formen 1;2;5;12;14.

De skal derefter stadig kunne ændres med roenings kode:

checkedElms="";
function markChecks(elm){
  if(elm.checked){
    if(checkedElms.indexOf(elm.value)==-1){
    checkedElms += ";" + elm.value;
    }
  }else{
    var reg = new RegExp(";?" + elm.value,"i");
    checkedElms = checkedElms.replace(reg,"");
  }
  if(checkedElms.indexOf(";")==0)
    checkedElms = checkedElms.substring(1);
  checkedElms = checkedElms.replace(/;;/g,";");
document.getElementById("amter").value = checkedElms;
}

Håber virkelig der er én eller anden der kan hjælpe mig.
Avatar billede eagleeye Praktikant
30. marts 2006 - 20:41 #1
Hvis du server side kender "tallet" på dem som er afkrydset og dermed skal med i strengen kan du vel også server side lave strengen med de valgte "1;2;5;12;14" og så sætte den ind i form feltet ?
Avatar billede eagleeye Praktikant
30. marts 2006 - 20:45 #2
Hvis ikke så hvad hedder checkboksne?
Avatar billede donslund Nybegynder
30. marts 2006 - 20:56 #3
Jeg har jo 1;2;5;12;14 stående i min db, så det er nemt at få ind i amter-feltet. Det er jo også denne streng jeg krydser de valgte amter af efter, men problemet er, hvis jeg, client-side, afkrydser flere amter eller fravælger en der allerede er afkrydset, så bliver strengen tømt i stedet for blot af lægge til/trække fra som roenvings kode gør.

Det er nok checkedElms=""; der gør det, men kan jeg undgå det hvis der allerede er afkrydsede felter.
Avatar billede donslund Nybegynder
30. marts 2006 - 21:09 #4
i øvrigt, så hedder de det samme som deres value, atlså fra 1 til 14
Avatar billede eagleeye Praktikant
30. marts 2006 - 21:18 #5
Jeg har på et tidpunkt brugt dette til at tælle hvor mange checkboxe der er kryds i:


function countCheckboxOn(theform, navn) {
  var antalOn = 0;
  if (document.all || document.getElementById) {
    for (i = 0; i < theform.length; i++) {
      var tempobj = theform.elements[i];
      if (tempobj.type.toLowerCase() == "checkbox" && tempobj.checked == true)
        antalOn = antalOn + 1;
    }
  }
  return antal;
}



Det kan nok laves sådan den tager value og ligger ind i en streng:

function countCheckboxOn(theform, navn) {
  var str = "";
  if (document.all || document.getElementById) {
    for (i = 0; i < theform.length; i++) {
      var tempobj = theform.elements[i];
      if (tempobj.type.toLowerCase() == "checkbox" && tempobj.checked == true)
      {
        if (str.length>0)
          str = str + ";"
        str = str + tempobj.value;
      } 
    }
  }
  //indsæt str i form feltet her
  theform.NavnetPåFeltet.value = str;
}
Avatar billede eagleeye Praktikant
30. marts 2006 - 21:45 #6
her et eksempel på hvordan :


<head>
<script>
function countCheckboxOn() {
  theform = document.formen;
  var str = "";
  if (document.all || document.getElementById) {
    for (i = 0; i < theform.length; i++) {
      var tempobj = theform.elements[i];
      if (tempobj.type.toLowerCase() == "checkbox" && tempobj.checked == true)
      {
        if (str.length>0)
          str = str + ";"
        str = str + tempobj.value;
      } 
    }
  }
  //indsæt str i form feltet her
  theform.textfeltet.value = str;
}
</script>
</head>
<body onload="countCheckboxOn()">

<form name="formen">
<input type="checkbox" name="1" value="1"><br>
<input type="checkbox" name="2" value="2"><br>
<input type="checkbox" name="3" value="3" checked><br>
<input type="checkbox" name="4" value="4"><br>
<input type="checkbox" name="5" value="5" checked><br>
<input type="checkbox" name="6" value="6" checked><br>
<input type="checkbox" name="7" value="7"><br>
<input type="checkbox" name="8" value="8"><br>

<input type="text" name="textfeltet"><br>
</form>
Avatar billede donslund Nybegynder
30. marts 2006 - 21:58 #7
Det er stadig et problem, at så snart jeg afkrydser et amt mere, så forsvinder alle de allered afkrydsede værdier fra feltet amter.
Avatar billede eagleeye Praktikant
30. marts 2006 - 22:09 #8
Ok så vidt jeg kan se skal values for de udfyldte felter ind strengen:

checkedElms="";


Så her hvor strengen ligges ind i form feltet "amter" så vidt jeg kan se
  //indsæt str i form feltet her
  theform.amtert.value = str;


Skal der tilføjes en linie sådan her så checkedElms får en start værdi:
  //indsæt str i form feltet her
  theform.amtert.value = str;
  checkedElms = str;



Det kræver så den nye funktion ligger efter den som du har i forvejen.
Avatar billede eagleeye Praktikant
30. marts 2006 - 22:10 #9
hmmm der som et t for meget i "amtert"
Avatar billede donslund Nybegynder
30. marts 2006 - 22:23 #10
Jamen det ser jo ud til, at det funker. Måske du kan hjælpe mig med en lille ind i den aller øverste fukntion her inden det bliver nat.

Hvis jeg i min streng har ex. 2;14 som reprøsentrer hhv. frederiksborg amt og norjyllands amt. Hvis jeg så klikker i københavns amt (1) sker der ingenting, men klikker jeg den fra igen får jeg 2;4 hvor jeg burde have fået først 2;14 så 2;14;1 og så 2;14

Den kan jeg ikke helt regne ud. Ka' du?
Avatar billede eagleeye Praktikant
30. marts 2006 - 22:27 #11
Arh ja det er fordi den leder efter 1 eller ;1 når den vil fjerne den den finder så  1 tallet i 14 og fjerner det :)

Så skal den funktion markChecks updateres lidt.
Avatar billede donslund Nybegynder
30. marts 2006 - 22:30 #12
Og det prøver jeg så lige om jeg kan ;-)

Kan du ikke starte med, at smide et svar, så har vi da det klaret.
Avatar billede eagleeye Praktikant
30. marts 2006 - 22:33 #13
Det samme gælder omvendt hvis du har 14 så vil den ikke indsætte 1 fordi den kan 1 tallet i 14


jeg har også prøvet at opdatere den og er kommet til dette:


function markChecks(elm){
  var tmp =";" + checkedElms + ";";
  if(elm.checked){
    if(tmp.indexOf(";"+elm.value+";")==-1){
    checkedElms += ";" + elm.value;
    }
  }else{
    var reg = new RegExp(";?" + elm.value + "(;|$)","i");
    checkedElms = checkedElms.replace(reg,"$1");
  }
  if(checkedElms.indexOf(";")==0)
    checkedElms = checkedElms.substring(1);
  checkedElms = checkedElms.replace(/;;/g,";");
document.getElementById("amter").value = checkedElms;
}
Avatar billede donslund Nybegynder
30. marts 2006 - 22:39 #14
Tja, næsten. Hvis der står 2;11;1 og jeg fjerne KBH (1), så er det det først 1 tal i 11 den fjerner.
Avatar billede eagleeye Praktikant
30. marts 2006 - 22:43 #15
Du har ret.. Så prøv denne jeg har rette RegExp til så den søger efter "StartPåStrengen eller ;" og "ikke ingenting eller ;":



function markChecks(elm){
  var tmp =";" + checkedElms + ";";
  if(elm.checked){
    if(tmp.indexOf(";"+elm.value+";")==-1){
    checkedElms += ";" + elm.value;
    }
  }else{
    var reg = new RegExp("(^|;)" + elm.value + "(;|$)","i");
    checkedElms = checkedElms.replace(reg,"$2");
  }
  if(checkedElms.indexOf(";")==0)
    checkedElms = checkedElms.substring(1);
  checkedElms = checkedElms.replace(/;;/g,";");
document.getElementById("amter").value = checkedElms;
}
Avatar billede donslund Nybegynder
30. marts 2006 - 22:51 #16
Så tror jeg sørme den er der og det helt inden det blev nat. Mange tak for hjælpen.
Avatar billede donslund Nybegynder
31. marts 2006 - 09:44 #17
Det er som om der mangler noget.

Jeg forsøger, at lave en try/catch på function countCheckboxOn() { da det jo ikke er alle sider denne formular findes, men function køres onload på alle sider.

Men jeg kan ikke få det til, at virke.


function countCheckboxOn(theform) {
try {
  var str = "";
  if (document.all || document.getElementById) {
    for (i = 0; i < theform.length; i++) {
      var tempobj = theform.elements[i];
      if (tempobj.name != "branche" && tempobj.type.toLowerCase() == "checkbox" && tempobj.checked == true) {
        if (str.length>0) {
          str = str + ";";
        }       
        str = str + tempobj.value;
      }
    }
//indsæt str i form feltet her
  theform.amter.value = str;
  checkedElms = str;
  }
}
catch(ex) {
}
Avatar billede eagleeye Praktikant
31. marts 2006 - 18:29 #18
Jeg har prøvet den funktion og umiddelbart virker den fint.

Jeg har prøvet den sidste jeg postede her så kom der "Error On Page" så har jeg kopiret din funktion og så viser den ikke længere fejl på siden.
Avatar billede donslund Nybegynder
31. marts 2006 - 18:44 #19
Nej, det var vist også min fejl kombineret med en god portion foryvivlelse over at jeg ikke kunne finde fejlen.

Lad os holde her.
Endnu en gang tak for hjælpen.
Avatar billede donslund Nybegynder
11. april 2006 - 14:39 #20
Halløj eagleeye, det virker pludseligt ikke mere. Hvad kan jeg have lavet forkert?

Formname = red_haand
onLoad = countCheckboxOn('red_haand')
Avatar billede eagleeye Praktikant
11. april 2006 - 14:57 #21
Umiddelbart er der to muligheder som jeg lige kan se.:

1. At skriver document.red_haand så den får overført det som et object og ikke navnet på formen.

onLoad = countCheckboxOn(document.red_haand)


Eller
2. At tilføje denne linie til funktionen får den finder form objectet ud fra navnet:

theform = document.forms[theform];


function countCheckboxOn(theform) {
try {
  theform = document.forms[theform];
  var str = "";
...resten af funktionen
Avatar billede eagleeye Praktikant
11. april 2006 - 14:59 #22
Til nr. 2 skal du beholde den onload du har vist 11/04-2006 14:39:06  ;)
Avatar billede donslund Nybegynder
11. april 2006 - 15:00 #23
function countCheckboxOn(theform) {
try {
alert('theform is found');
  var str = "";
  if (document.all || document.getElementById) {
    for (i = 0; i < theform.length; i++) {
// alert(theform.length);

      var tempobj = theform.elements[i];
    if (tempobj.name != "branche" && tempobj.type.toLowerCase() == "checkbox" && tempobj.checked == true) {
        if (str.length>0) {
          str = str + ";";
        }       
        str = str + tempobj.value;
      }
    }
//indsæt str i form feltet her
  theform.amter.value = str;
  checkedElms = str;
  }
} catch(ex) {
}
}


Dette udløser alert'en. Så den får fint nok fat i formularen.

Det er faktisk først når vi kommer efter     
if (tempobj.name != "branche" && tempobj.type.toLowerCase() == "checkbox" && tempobj.checked == true) {
at den ikke reagerer på en alert mere.
Avatar billede eagleeye Praktikant
11. april 2006 - 15:04 #24
Den første alert vil altid komme, den kommer når funktionen bliver kaldt.

Den vil fejle her:

  var tempobj = theform.elements[i];

Da theform bare en streng hvor der står "red_haand".


Derfor skal det laves på en af de to måder så theform bliver et object som peger på formen.
Avatar billede donslund Nybegynder
11. april 2006 - 15:26 #25
Jeg valgte: theform = document.forms[theform];

Men som du kan se, så tjekker jeg på alle elementer der ikke hedder branche. Det er fordi jeg har en funktion der er magen til, som tjekker på alle elementer der hedder branche. Men den vil ikke fungere. Heller ikke selvom hef smider ovenstående linie ind i funktionen.

function countBrancher(theform) {
try {
  theform = document.forms[theform];
  var str = "";
  if (document.all || document.getElementById) {
    for (i = 0; i < theform.length; i++) {
      var tempobj = theform.elements[i];
      if (tempobj.name == "branche" && tempobj.type.toLowerCase() == "checkbox" && tempobj.checked == true) {
        if (strb.length>0) {
            str = str + ";";
            str = str + tempobj.value;
        } 
      }
    }
//indsæt str i form feltet her
  theform.brancher.value = str;
  checkedBrancher = str;
  }
} catch(f) {
}
}
Avatar billede donslund Nybegynder
11. april 2006 - 15:42 #26
Nå, jeg byggede de to funktioner sammen til en.

function countCheckboxOn(theform) {
try {
theform = document.forms[theform];
// alert('theform is found');
  var str = "";
  var strb = "";
  if (document.all || document.getElementById) {
    for (i = 0; i < theform.length; i++) {
// alert(theform.length);

      var tempobj = theform.elements[i];
    if (tempobj.name != "branche" && tempobj.type.toLowerCase() == "checkbox" && tempobj.checked == true) {
        if (str.length>0) {
          str = str + ";";
        }       
        str = str + tempobj.value;
      }
    if (tempobj.name == "branche" && tempobj.type.toLowerCase() == "checkbox" && tempobj.checked == true) {
        if (strb.length>0) {
          strb = strb + ";";
        }       
        strb = strb + tempobj.value;
      }
    }
//indsæt str i form feltet her
  theform.amter.value = str;
  checkedElms = str;
  theform.brancher.value = strb;
  checkedBrancher = strb;
  }
} catch(ex) {
}
}
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