Avatar billede casper_skovgaard Nybegynder
12. august 2008 - 15:24 Der er 16 kommentarer og
1 løsning

problem med labels i ie ved brug af createElement

jeg har følgende script som virker fint i firefox, men i ie virker det ikke når man klikker på labellen for at checke en checkbox.

Hvad kan der være galt?

var keywords = new Array("val1","val2","val3");

var checkboxHolder = document.getElementById("checkboxHolder");

for (var i=0; i<keywords.length; i++) {
    var lbl = document.createElement("label");
    lbl.setAttribute("for","checkbox" + i.toString());
    lbl.appendChild(document.createTextNode(keywords[i]));

    var cb = document.createElement("input");
    cb.setAttribute("type","checkbox");
    cb.setAttribute("name","checkboxset");
    cb.setAttribute("id","checkbox" + i.toString());
    cb.setAttribute("value", keywords[i]);
    cb.setAttribute("checked", "true");
    cb.setAttribute("defaultChecked", "true");

    checkboxHolder.appendChild(cb);
    checkboxHolder.appendChild(lbl);

    var br = document.createElement("br");
    checkboxHolder.appendChild(br);
}
Avatar billede w13 Novice
12. august 2008 - 15:26 #1
Hvad hvis du retter:

lbl.setAttribute("for","checkbox" + i.toString());

til:

lbl.for="checkbox" + i.toString();

?
Avatar billede w13 Novice
12. august 2008 - 15:39 #2
Næh, det ser vist heller ikke ud til at virke. Hmm. Måske det er en bug.

Ellers kan det jo løses med:

lbl.onclick=new Function("document.getElementById('checkbox"+i.toString()+"').focus()");

så det bare bliver gjort med JavaScript, når for'en ikke virker.
Avatar billede casper_skovgaard Nybegynder
12. august 2008 - 15:40 #3
nej det virker ikke lige. får en fejl "Expected identifier" ???
Avatar billede w13 Novice
12. august 2008 - 15:47 #4
Prøvet min løsning 12/08-2008 15:39:09?
Avatar billede casper_skovgaard Nybegynder
12. august 2008 - 15:47 #5
jeg lader lige spørgsmålet stå åbent lidt længere. og hvis der ikke kommer nogle bedre forslag vil jeg bruge onclick løsning.
Avatar billede w13 Novice
12. august 2008 - 15:48 #6
Den har jeg testet. Og ja, da jeg testede min første løsning, fik jeg også "Expected identifier"-fejlen.
Avatar billede casper_skovgaard Nybegynder
12. august 2008 - 15:49 #7
har ikke prøvet den men kan godt se ideen i den. men vil focus() checke / unchecke checkboksen?
Avatar billede w13 Novice
12. august 2008 - 15:51 #8
Ok, nu har jeg fundet ud af det.
Endnu engang skal IE have særbehandling.

IE kan kun finde ud af at sætte attributten "htmlFor", hvor andre browsere sætter "for".

Ref.: http://lists.evolt.org/archive/Week-of-Mon-20050221/169816.html
Avatar billede w13 Novice
12. august 2008 - 15:52 #9
Nej, glemte at det var en checkbox, så der skulle lidt mere kode til at få onclick-løsningen til at fungere.
Avatar billede w13 Novice
12. august 2008 - 15:55 #10
Hvis det ikke virker med:

lbl.setAttribute("htmlFor","checkbox" + i.toString());

må du bruge:

lbl.htmlFor="checkbox" + i.toString();

Det var denne, jeg testede.
Avatar billede casper_skovgaard Nybegynder
12. august 2008 - 16:15 #11
perfekt det virker, tak for hjælpen :)
Avatar billede w13 Novice
12. august 2008 - 16:15 #12
Og tak for point! :)
Avatar billede w13 Novice
12. august 2008 - 16:16 #13
Virkede det i øvrigt med .htmlFor eller med setAttribute?
Avatar billede olebole Juniormester
12. august 2008 - 23:50 #14
<ole>

Det virker med:
    LABEL.htmlFor = "ID";

- men der er et andet væsentligt problem med koden! IE kan ikke sætte name attributter på form elementer  :o|

Man er nødt til at bruge syntaksen:
    var oInput = document.createElement("<input name='elementNavn'>");
    oInput.setAttribute("type", "checkbox");
    ... osv ...

Det stinker naturligvis i forhold til standarden, men det er desværre nødvendigt, hvis man vil have IE til at makke ret.

Denne linje giver ikke mening:
    cb.setAttribute("defaultChecked", "true");

Der er ikke en attribut med det navn - og selvom man bruger 'checked', så giver værdien 'true' ikke mening. Attributten 'checked' kan kun have værdien 'checked'. I stedet bør der altså stå:
    cb.setAttribute("checked", "checked");

/mvh
</bole>
Avatar billede olebole Juniormester
13. august 2008 - 00:33 #15
- update: Det viser sig, der alligevel er en udvej til at få IE til at forstå 'for' sat med setAttribute  =)
Dette virker, som bekendt, ikke:

<input type="checkbox" id="check_a">

<script type="text/javascript">
var o = document.getElementById("check_a");
var oo = document.createElement("label");
oo.appendChild( document.createTextNode("MyLabelText") );
oo.setAttribute("for", "check_a");
o.parentNode.insertBefore(oo, o.nextSibling);
</script>

Hvis man derefter flytter checkboxen ind under label elementet, virker sidstnævnte som forventet. Det kan gøres ved at tilføje denne linje i slutningen af scriptet:
    oo.insertBefore(o, oo.firstChild);
Avatar billede olebole Juniormester
13. august 2008 - 00:40 #16
Opretter man både checkbox og label element dynamisk, vil man nok bare oprette label elementet - indsætte checkboxen i den - derefter indsætte teksten - og til sidst indsætte label elementet med hele indholdet. Ikke testet, men prøv det  =)
Avatar billede casper_skovgaard Nybegynder
13. august 2008 - 10:40 #17
>> ole tak for de ekstra informationer. Jeg har prøvet lidt frem og tilbage men jeg kan ikke få det til at virke uden htmlFor.

defaultChecked er med forbi checkboksene ellers ikke vil være udfyldt i ie...

Name problemet er løst med en try/catch da firefox ikke godtager ie syntaksen...

Her er så den kode jeg er kommet op med indtil videre, som både virker i ie og ff:

var keywords = new Array("val1","val2","val3");

var checkboxHolder = document.getElementById("checkboxHolder");

for (var i=0; i<keywords.length; i++) {
    var lbl = document.createElement("label");
    lbl.setAttribute("for","checkbox" + i.toString());
    lbl.setAttribute("htmlFor","checkbox" + i.toString());
    lbl.appendChild(document.createTextNode(keywords[i]));

    var cb;
    try {
        cb = document.createElement('<input name="checkboxset">');
    } catch (e) {
        cb = document.createElement("input");
        cb.setAttribute("name","checkboxset");
    }
    cb.setAttribute("type","checkbox");
    cb.setAttribute("id","checkbox" + i.toString());
    cb.setAttribute("value", keywords[i]);
    cb.setAttribute("checked", "checked");
    cb.setAttribute("defaultChecked", "checked");

    checkboxHolder.appendChild(cb);
    checkboxHolder.appendChild(lbl);

    var br = document.createElement("br");
    checkboxHolder.appendChild(br);
}
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