Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

HTMLOptionsCollection en named items

Pagina: 1
Acties:

  • flowerp
  • Registratie: September 2003
  • Laatst online: 11-09 18:20
Wat betreft de HTMLOptionsCollection kwam ik wat eigenaardige dingen tegen. Volgens de W3C spec, kan ik vanuit zo'n collection een element by name opvragen. Zie: http://www.w3.org/TR/2003...tml#HTMLOptionsCollection

B.v. deze quote:
An HTMLOptionsCollection is a list of nodes representing HTML option element. An individual node may be accessed by either ordinal index or the node's name or id attributes.
Echter, als ik me niet vergis mag een option element helemaal geen name attribute hebben. De reden van een dergelijk verbod snap ik niet helemaal, maar gezien dat feit dat dat niet mag is de bovenstaande uitleg niet helemaal helder, aangezien die wel spreekt van een name.

Opvragen per ID is wellicht niet super nuttig, aangezien een ID toch al uniek zou moeten zijn voor je hele document. In plaats van een element via de HTMLOptionsCollection op te vragen by id, kun je net zo goed meteen document.getElementById() gebruiken.

Wie weet hoe het nu zit met die named items?

De verschillende browsers gaan er overigens nogal verschillend mee om. Bij het uitvoeren van onderstaande HTML geeft Firefox 2 en Safari 3 alle 3x keer het bedoelde Object terug, Opera 9 faalt bij de "by name", en IE 7 doet het alleen bij de "by id" met de expliciete namedItem call, maar faalt bij gebruikmaking van de [] operator. (HTML 5 lijkt daar wat specifieker over te zijn: http://www.whatwg.org/spe...rk/#htmloptionscollection )

_
HTML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<html>
<body>

<select name="test" id="foo_name">
   <option name="x" value="1">optie 1</option>
   <option name="y" value="2">optie 2</option>
</select>

<select name="test" id="foo_id">
   <option id="x" value="1">optie 1</option>
   <option id="y" value="2">optie 2</option>
</select>

<script type="text/javascript">  
   var fooName = document.getElementById("foo_name").options;
   alert( 'Getting by name :' + fooName.namedItem('x'));

   var fooID = document.getElementById("foo_id").options;
   alert( 'Getting by id :' + fooID.namedItem('x'));

   alert( 'Getting by id,using [] :' + fooID['x']);
</script>

</body>
</html>

It's shocking to find how many people do not believe they can learn, and how many more believe learning to be difficult.


  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

offtopic:
Je kan beter naar de multipage versie van de HTML5 draft linken: HTMLOptionsCollection ;)

Intentionally left blank


  • Borizz
  • Registratie: Maart 2005
  • Laatst online: 24-09 20:59
Wat wil je precies bereiken met dit topic?

Loop je tegen een probleem aan? Of wil je gewoon even aangeven dat de specificatie niet echt consistent is voor wat betreft dit onderwerp (en de implementatie in de browsers nog minder).

Het doel van een selectbox is in de meeste gevallen toch om een bepaalde waarde (of meerdere waardes) te selecteren. Deze kan je prima uitlezen, zowel serverside (door het submitten van een formulier) als met javascript (selectedIndex, selected property). Ik zou zo ook geen idee hebben wanneer ik namedItem zou gebruiken, maar die ideeën zijn natuurlijk altijd welkom.

If I can't fix it, it ain't broken.


  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Persoonlijk denk ik dat dit gewoon voer is voor de HTML WG mailinglist. De HTML5 draft is nog onder review en het doel is uiteindelijk om te komen tot een eenduidige standaard (daar ontbreekt het nogal aan wat je hier weer mooi illustreert ;)).

Het algoritme voor de DOM interface zoals beschreven in HTML5 lijkt een zinnige (Opera en IE zouden dus hun implementatie op dat punt moeten aanpassen), maar een dergelijk algoritme is een UA-requirement en wil niet zeggen dat het name-attribuut ook author-conformant is (dat zie ik ook niet gebeuren eerlijk gezegd aangezien dat weinig zinvol lijkt).

Intentionally left blank


  • flowerp
  • Registratie: September 2003
  • Laatst online: 11-09 18:20
Borizz schreef op zaterdag 29 december 2007 @ 21:03:
Wat wil je precies bereiken met dit topic?
Wie weet hoe het nu zit met die named items?
;)

It's shocking to find how many people do not believe they can learn, and how many more believe learning to be difficult.


  • Borizz
  • Registratie: Maart 2005
  • Laatst online: 24-09 20:59
Volgens mij was je er zelf al redelijk achter hoe het zit, dus vandaar mijn vraag.

If I can't fix it, it ain't broken.


  • Juup
  • Registratie: Februari 2000
  • Niet online
Names op options is erg verwarrend dus prima dat het verboden is.

Een wappie is iemand die gevallen is voor de (jarenlange) Russische desinformatiecampagnes.
Wantrouwen en confirmation bias doen de rest.


  • flowerp
  • Registratie: September 2003
  • Laatst online: 11-09 18:20
Juup schreef op zondag 30 december 2007 @ 03:50:
Names op options is erg verwarrend dus prima dat het verboden is.
Ten eerste wat ik dan niet begrijp: waarom spreekt men dan in de aangehaalde quote uit de spec over names op options? In welke HTML variant is dat dan wel toegestaan?

Daarnaast, waarom is het verwarrend als options names zouden mogen hebben. Je definieert dan lokale namen voor elementen binnen de parent die het select element is. Net zoals ordinals (natuurlijk) lokaal zijn, zo zijn names dat dan ook.

Wellicht zie ik wat over het hoofd, maar de reden van het verbod is mij eigenlijk niet super duidelijk. Gaat het soms om een interactie met wat anders?

It's shocking to find how many people do not believe they can learn, and how many more believe learning to be difficult.


  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

flowerp schreef op zondag 30 december 2007 @ 12:10:
[...]


Ten eerste wat ik dan niet begrijp: waarom spreekt men dan in de aangehaalde quote uit de spec over names op options? In welke HTML variant is dat dan wel toegestaan?
Het is in geen enkele HTML variant conformant, maar een DOM-implementatie dient wel een bepaald algoritme te volgen indien een namedItem wordt opgevraagd.
Daarnaast, waarom is het verwarrend als options names zouden mogen hebben. Je definieert dan lokale namen voor elementen binnen de parent die het select element is. Net zoals ordinals (natuurlijk) lokaal zijn, zo zijn names dat dan ook.
Als je daar een usecase voor kan verzinnen dan zou je dat kunnen aandragen in de HTML WG, wellicht maken ze het dan wel conformant ;)
Wellicht zie ik wat over het hoofd, maar de reden van het verbod is mij eigenlijk niet super duidelijk. Gaat het soms om een interactie met wat anders?
'verbod' is een erg sterk woord, daar is ook geen sprake van. Als jij je option elementen een name-attribuut wil geven dan zal je echt geen bekeuring krijgen van het W3C ;)
Het enige probleem wat je dan echter hebt is dat op dit moment niet alle UA's correct het algoritme zoals gedefinieerd in de DOM specificatie voor het opvragen van een namedItem correct geimplementeerd hebben. Ik denk dat daarom de HTML5 specificatie daar ook specifieker in is.

Intentionally left blank


  • flowerp
  • Registratie: September 2003
  • Laatst online: 11-09 18:20
crisp schreef op zondag 30 december 2007 @ 16:31:
Als je daar een usecase voor kan verzinnen dan zou je dat kunnen aandragen in de HTML WG, wellicht maken ze het dan wel conformant ;)
1 usecase die ik kan bedenken is dat je options binnen een select element programmatisch op een bepaalde waarde wilt zetten. Stel voor dat je meerdere select elementen hebt op een pagina, waarbij niet elke select exact dezelfde options bevat. Met named options kun je via je script heel makkelijk kijken of je select de juiste soort option bevat, en die dan b.v. selecten.

Misschien dat er voor zo'n usecase ook wel andere mogelijkheden zijn, maar het lijkt me een logische aanpak:

"van het select element Foo wil ik de (logische) option Bar geselect hebben"

i.p.v.

"ik onthoud een mapping waarbij ordinal 3 van select element Foo overeenkomt met de logische Bar. Als ik dan van het select element Foo de option Bar geselect wil hebben, select ik nummer 3."

It's shocking to find how many people do not believe they can learn, and how many more believe learning to be difficult.


  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

flowerp schreef op zondag 30 december 2007 @ 18:02:
[...]


1 usecase die ik kan bedenken is dat je options binnen een select element programmatisch op een bepaalde waarde wilt zetten. Stel voor dat je meerdere select elementen hebt op een pagina, waarbij niet elke select exact dezelfde options bevat. Met named options kun je via je script heel makkelijk kijken of je select de juiste soort option bevat, en die dan b.v. selecten.

Misschien dat er voor zo'n usecase ook wel andere mogelijkheden zijn, maar het lijkt me een logische aanpak:

"van het select element Foo wil ik de (logische) option Bar geselect hebben"

i.p.v.

"ik onthoud een mapping waarbij ordinal 3 van select element Foo overeenkomt met de logische Bar. Als ik dan van het select element Foo de option Bar geselect wil hebben, select ik nummer 3."
Interesting, maar waarom zou je daar niet bijvoorbeeld class voor gebruiken? ;)

Intentionally left blank


  • flowerp
  • Registratie: September 2003
  • Laatst online: 11-09 18:20
crisp schreef op zondag 30 december 2007 @ 22:42:
[...]

Interesting, maar waarom zou je daar niet bijvoorbeeld class voor gebruiken? ;)
Misschien omdat ik niet zo slim ben en die mogelijkheid nog niet overwogen had ;) Tot nu toe had ik het class attribute eigenlijk meer alleen geassocieerd met CSS. Ik zal eens kijken hoe dit precies voor bovengenoemde usecase te gebruiken is.

It's shocking to find how many people do not believe they can learn, and how many more believe learning to be difficult.


  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

flowerp schreef op zondag 30 december 2007 @ 22:46:
[...]


Misschien omdat ik niet zo slim ben en die mogelijkheid nog niet overwogen had ;) Tot nu toe had ik het class attribute eigenlijk meer alleen geassocieerd met CSS. Ik zal eens kijken hoe dit precies voor bovengenoemde usecase te gebruiken is.
class is multi-purpose (hoewel de meningen daarover verschillen, sommige mensen vinden toch dat het puur voor CSS gebruikt moet worden, maar de alternatieven - rel en role* - zijn niet in alle situaties bruikbaar) en getElementsByClassName is inmiddels een gedefinieerde DOM method die in o.a. Firefox 3 al native ondersteund wordt.

* rel wordt niet voor elk element gedefinieerd en (XHTML2's) role is in geen enkele HTML-variant valide hoewel HTML5 het wellicht wel gaat definieren.

Intentionally left blank

Pagina: 1