[javascript] verkrijgen ID op naam

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb een formulier met een aantal checkboxes die ik onload wil laten aanvinken.
De boxes hebben een id in de vorm van: area1, area2, area3 enz omdat een ander script hier gebruikt van moet maken. Echter de waardes zijn anders en afhankelijk van deze waardes dient er gecheck te worden of niet.

Ik verkrijg de waardes vanuit een database en roep deze onload aan:

JavaScript:
1
document.onload = setPrefs(new Array('lokaal','provenciaal','landelijk','benelux','flyeren','enqueteren','promotie','straat','concert','festivals','za','zo','ma','di','wo','do','vr','ochtend','middag','avond','nacht','1-10'));


de functie dient dus per array waarde kijken of een element met deze name bestaat en deze vervolgens aanvinken.
de code die ik geschreven hebt geeft geen fouten, maar doet echter ook niets. Hopelijk kan iemand me de juiste kant op wijze om dit op te lossen.
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function setPrefs(dataArray)
    {
    var arr = new Array()
    for(i = 0; i< dataArray.length; i++)
        {
        arr = document.getElementsByName(dataArray[i]);
        }
    for(i = 0; i< dataArray.length; i++)
        {
        for(var o = 0; o < arr.length; o++)
            {
            var obj = document.getElementsByName(dataArray[i]).item(o);
            document.getElementById(obj.id).checked = true;
            alert(obj.id + " =  " + obj.value);
            }
        }
    }


de alert zit er in voor het testen, maar zelfs deze werkt niet.

Acties:
  • 0 Henk 'm!

  • Mental
  • Registratie: Maart 2000
  • Laatst online: 20-10-2020
Doe eens een output van dataArray in de eerste for-loop,als die invoer leeg is zal de uitvoer ook leeg zijn he.
En aangezien de arr.length dan 0 is zal de 2e for-loop nooit afgetrapt worden.

Acties:
  • 0 Henk 'm!

  • Amras
  • Registratie: Januari 2003
  • Laatst online: 17:20
Houd er rekening mee dat na het uitvoeren van de eerste loop de variabele arr de elementen bevat met de naam van de laatst meegegeven string (in dit geval dus '1-10'). Dat lijkt me niet de bedoeling. ;)

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 01:18

crisp

Devver

Pixelated

de functie dient dus per array waarde kijken of een element met deze name bestaat en deze vervolgens aanvinken.
Dan kom je logischerwijs toch op een dergelijke functie uit:
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
function setPrefs(dataArray)
{
    var form = document.forms['formid'];
    if (form)
    {
        for (var i = 0, l = dataArray.length, cb; i < l; i++)
        {
            if ((cb = form.elements[dataArray[i]]))
                cb.checked = true;
        }
    }
}

:?

(eventueel nog een stukje branching indien form.elements[] meerdere elementen teruggeeft met dezelfde naam, maar je kan zelf het beste bepalen of dat kan voorkomen in jouw geval).

Je bent in je eigen functie wel heel erg aan het goochelen, en dit:
JavaScript:
1
document.getElementById("'"+obj.id+"'")

geeft sowieso niet wat je wilt; dat zou dan minstens gewoon document.getElementById(obj.id) moeten zijn, maar geeft als het goed is dan gewoon weer dezelfde pointer terug als waar 'obj' al naar verwijst. En inderdaad, 'arr' is in de tweede loop altijd een collectie van het laatste item uit je dataArray...

[ Voor 26% gewijzigd door crisp op 22-01-2010 11:46 ]

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Ehm, WTF?
JavaScript:
1
document.getElementById("'"+obj.id+"'")

Ik neem aan dat je nergens een veld hebt met het dit soort id?
HTML:
1
<input id="'blaat'" .... />

Zelfs onze highlighter geeft al aan dat dat verkeerd is. 8)7

Afgezien van dat: Waar hoort mijn topic?
PRG>>WEB

[ Voor 10% gewijzigd door NMe op 22-01-2010 11:44 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
crisp schreef op vrijdag 22 januari 2010 @ 11:41:
[...]

Dan kom je logischerwijs toch op een dergelijke functie uit:
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
function setPrefs(dataArray)
{
    var form = document.forms['formid'];
    if (form)
    {
        for (var i = 0, l = dataArray.length, cb; i < l; i++)
        {
            if ((cb = form.elements[dataArray[i]]))
                cb.checked = true;
        }
    }
}

:?


Je bent in je eigen functie wel heel erg aan het goochelen, en dit:
JavaScript:
1
document.getElementById("'"+obj.id+"'")
De bovenste functie gaat toch uit van ID's en niet van de name="" tag?

En ja ik ben aan het goochelen geweest >:)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Mental schreef op vrijdag 22 januari 2010 @ 11:29:
Doe eens een output van dataArray in de eerste for-loop,als die invoer leeg is zal de uitvoer ook leeg zijn he.
En aangezien de arr.length dan 0 is zal de 2e for-loop nooit afgetrapt worden.
een alert op dataArray.length geeft undefined aan. Ik begrijp echter niet waarom.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Omdat, no offense, je Javascript verre van logisch is. Ik zie met de beste wil van de wereld niet wat je denkt dat die code moet doen. :P

Wat voldoet er precies niet aan de code die crisp geeft?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
NMe schreef op vrijdag 22 januari 2010 @ 11:58:
Omdat, no offense, je Javascript verre van logisch is. Ik zie met de beste wil van de wereld niet wat je denkt dat die code moet doen. :P

Wat voldoet er precies niet aan de code die crisp geeft?
non taken

Het doel is om aan de hand van de name tag een checkbox aan te vinken en niet per ID want die heb ik niet in de database. De code van Crips geeft geen fouten maar voert ook niets uit, omdat deze volgens mij naar ID's zoekt en niet name tags. (kan het fout hebben, zie nu even door de bomen het bos niet meer).

Acties:
  • 0 Henk 'm!

  • gvdh
  • Registratie: December 2009
  • Laatst online: 19-09 14:24
Bestaan de form-elementen überhaupt wel op het moment dat de functie uitgevoerd wordt?
document.onload = setPrefs(...);
doet niet wat je op het eerste zicht denkt dat het doet. Dit zal op het moment dat het Javascript-bestand uitgevoerd wordt, de functie setPrefs uitvoeren. Maar, op dit moment is de pagina misschien nog niet helemaal opgebouwd.
Daarna zal aan document.onload de returnvalue van setPrefs toegewezen worden.
Ik denk dat je beter de functie aanroept helemaal onderaan de html-pagina.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
de document.onload functie staat onderaan de pagina, al het HTML is geladen.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb het script van crips naar wat aanpassingen in de html werkende gekregen.
Bedankt voor het geduld en de kennis.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Verwijderd schreef op vrijdag 22 januari 2010 @ 12:19:
de document.onload functie staat onderaan de pagina, al het HTML is geladen.
De HTML is sowieso al geladen als de onload wordt uitgevoerd. :)

Trouwens, ik ben zelf niet goed met Javascript, maar document heeft toch helemaal geen event handlers? Moet je niet een onload op de window/body zetten in plaats van op de document?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Amras
  • Registratie: Januari 2003
  • Laatst online: 17:20
NMe schreef op vrijdag 22 januari 2010 @ 12:27:
[...]
Trouwens, ik ben zelf niet goed met Javascript, maar document heeft toch helemaal geen event handlers? Moet je niet een onload op de window/body zetten in plaats van op de document?
En daarbij, moet je geen verwijzing naar een functie in het event stoppen, i.p.v. het result van een void functie? Dus zoiets:

JavaScript:
1
2
3
4
body.onload = function()
{
    setPrefs(...);
}

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 01:18

crisp

Devver

Pixelated

Je onload handler is inderdaad ook fout; dat moet meer zoiets zijn:
JavaScript:
1
2
3
4
5
6
7
8
9
window.onload = function()
{
    setPrefs([
        'lokaal','provenciaal','landelijk','benelux','flyeren',
        'enqueteren','promotie','straat','concert','festivals',
        'za','zo','ma','di','wo','do','vr',
        'ochtend','middag','avond','nacht','1-10'
    ]);
}

(meteen maar even onload op het juiste object gezet en gewoon een array literal gebruikt ipv onnodig gebruik maken van de Array constructor)

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

En dan nog een laatste dingetje: "1-10" is absoluut geen geldige name voor een element in welke programmeertaal dan ook, inclusief HTML. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 01:18

crisp

Devver

Pixelated

NMe schreef op vrijdag 22 januari 2010 @ 12:35:
En dan nog een laatste dingetje: "1-10" is absoluut geen geldige name voor een element in welke programmeertaal dan ook, inclusief HTML. ;)
Nee hoor, name-attributes zijn van type CDATA en mogen dus van alles bevatten ;)

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 18-09 16:28
crisp schreef op vrijdag 22 januari 2010 @ 12:42:
[...]

Nee hoor, name-attributes zijn van type CDATA en mogen dus van alles bevatten ;)
Uit diezelfde link (onder het kopje cdata):
ID and NAME tokens must begin with a letter ([A-Za-z]) and may be followed by any number of letters, digits ([0-9]), hyphens ("-"), underscores ("_"), colons (":"), and periods (".").
:+

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 01:18

crisp

Devver

Pixelated

Bosmonster schreef op vrijdag 22 januari 2010 @ 12:50:
[...]


Uit diezelfde link (onder het kopje cdata):


[...]


:+
Lees de spec nog eens goed door; een name-attribuut is geen NAME token (zie de DTD) :+

Het beste voorbeeld is denk ik wel dit wat veelvuldig gebruikt wordt en dus invalid zou zijn als het name-attribuut geen CDATA maar een NAME token zou zijn:
HTML:
1
2
3
<input type="checkbox" value="1" name="foo[]">
<input type="checkbox" value="2" name="foo[]">
<input type="checkbox" value="2" name="foo[]">

[ Voor 36% gewijzigd door crisp op 22-01-2010 13:19 ]

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 18-09 16:28
Maar krijg je dan niet hele rare verschijnselen met een name als "5" en je bijvoorbeeld de elements-array aan zou roepen?

Ik heb er nooit mee gespeeld, want het leek me altijd wel logisch dat het potentiele problemen op kon leveren gezien JS' weakly typed eigenschap.

[ Voor 6% gewijzigd door Bosmonster op 22-01-2010 13:35 ]


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 01:18

crisp

Devver

Pixelated

Bosmonster schreef op vrijdag 22 januari 2010 @ 13:34:
Maar krijg je dan niet hele rare verschijnselen met een name als "5" en je bijvoorbeeld de elements-array aan zou roepen?

Ik heb er nooit mee gespeeld, want het leek me altijd wel logisch dat het potentiele problemen op kon leveren gezien JS' weakly typed eigenschap.
Jep, net als een form-element een name="submit" geven levert dat inderdaad problemen op; het is dan ook niet verstandig (maar wel valide) om puur numerieke name-attributen te gebruiken als je die elementen ook via de elements collectie wil kunnen benaderen:
HTML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<!doctype html>
<script>

window.onload = function()
{
    alert(document.forms['foo'].elements['5'].value);
    alert(document.getElementsByName('5')[0].value);

    alert(document.forms['foo'].elements['1-10'].value);
    alert(document.getElementsByName('1-10')[0].value);
}

</script>
<form id="foo">
<input type="text" name="1" value="1">
<input type="text" name="2" value="2">
<input type="text" name="3" value="3">
<input type="text" name="4" value="4">
<input type="text" name="5" value="5">
<input type="text" name="1-10" value="1-10">
</form>

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Goed, dan mág het in HTML wel, maar dan mag het van mij nog niet. :+ 't Is hoe dan ook geen verstandige keuze. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • driaker
  • Registratie: April 2009
  • Laatst online: 12-09 23:09
Wat dacht je van server-side logica en dan gewoon het checked attribuut gebruiken.
code:
1
<input name="area1" id="area1" type="checkbox" checked="checked" value="foo" />

watte?

Pagina: 1