In het Document Object Model wordt nergens een array object gebruikt, toch zie je in scripts die wel met het DOM werken vaak array's terug op plaatsen waar dat eigenlijk niet hoort. Ik zal een paar voorbeelden geven:
Waar coll dus wordt gebruikt als array.
Op zich is er niet zoveel verkeerd mee, zou je denken. Maar ik zie het nu eigenlijk al gebeuren dat er problemen ontstaan omdat alles op zoveel manieren aangesproken kan worden. Het is alsof we ervanuit gaan dat wat we nu maken altijd zal blijven werken omdat toekomstige versies altijd backward compatible zullen zijn.
Ik raad iedereen die denkt dat hij met het Document Object Model overweg kan, om eens in een andere taal te gaan werken, bijvoorbeeld Java, of C++. Dan zullen de typen niet automatisch gecast worden, en stuit je zonder meer op problemen.
Hoe moet het dan wel?
Moeten is een groot woord. Het is misschien beter om 'zou behoren te gaan' te gebruiken
Volgens de HTML DOM level 1 Specificatie uit 1998 (!) bevat document.images een HTMLCollection object, en geen array, zoals wel vaak wordt gebruikt (als erfgoed van de pre-DOM-era). En de methode document.getElementsByTagName geeft een NodeList terug, en geen array.
Als je verder over het Document Object Model gaat lezen, ga je beseffen dat er eigenlijk helemaal nergens over array's gesproken wordt. Alleen over objecten, die wellicht intern array's of vectoren bevatten, maar die dat zelf niet zijn.
De voorbeelden die ik hierboven noemde, hadden volgens de DOM specificatie als volgt moeten zijn:
en
En dat werkt ook 'gewoon' in DOM compatible browsers. Dit werkt zo in alle scripting- en programmeertalen die met het Document Object Model overweg kunnen. Er zijn hooguit wat kleine veranderingen als een taal iets niet ondersteunt.
Wat zijn de gevolgen?
Dat vraag ik me nu dus af. Ik dacht altijd dat ik het zelf op de goede manier deed, maar nu blijkt toch dat bepaalde dingen die voor de hand lijken te liggen toch anders zijn. Op dit moment vind ik het moeilijk om te zeggen wat nu écht de goede methode is.
Met Javascripts zijn die array's vaak zo handig te gebruiken. Maar in feite is het de bedoeling om alle objecten via DOM methoden aan te spreken.
Toch ben ik daar nog niet helemaal uit.
Wat moet je anderen nu aanraden om te gaan gebruiken? Gaat het DOM model te ver op dit moment? Is het te omslachtig? Ik heb altijd gezegd dat afkorten een slechte gewoonte is, en met het echte DOM scripten krijg je vaak vreselijk lange statements.
De andere kant van het verhaal is dat je in andere talen dan Javascript vaak geen keuze hebt. Je krijgt onvermijdelijk compiler errors als je altijd gewend bent om iets in Javascript moet schrijven, en nu eens iets in bijvoorbeeld Java moet maken. Maar dat is juist iets waarvoor het Document Object Model bedoeld is. Het is universeel, en niet alleen bedoeld voor gebruik in webpagina's. Net als XML dus wel voortvloeiend vanuit de internet wereld, maar niet uitsluitend aarvoor bedoeld.
Maar gaan we niet hetzelfde krijgen als met HTML? De documentatie op het internet is sterk verouderd. Er zijn bijvoorbeeld nog genoeg tutorial pagina's die niet verder komen dan HTML 3.2. We klagen nu over de verschillen tussen de browsers, en backward compatibility.
Is het nu niet eens tijd om over te stappen naar 100% DOM scripting, dus zuiver en alleen methoden te gebruiken zoals vermeld in de DOM specificaties?
(Dit zou het einde betekenen voor properties als innerHTML, en zal échte kennis van het DOM model vereisen)
JavaScript:
1
2
| coll = document.getElementsByTagName('img'); alert(coll[3].src); |
Waar coll dus wordt gebruikt als array.
JavaScript:
1
| document.images['logo'].src = 'w3c.png'; |
Op zich is er niet zoveel verkeerd mee, zou je denken. Maar ik zie het nu eigenlijk al gebeuren dat er problemen ontstaan omdat alles op zoveel manieren aangesproken kan worden. Het is alsof we ervanuit gaan dat wat we nu maken altijd zal blijven werken omdat toekomstige versies altijd backward compatible zullen zijn.
Ik raad iedereen die denkt dat hij met het Document Object Model overweg kan, om eens in een andere taal te gaan werken, bijvoorbeeld Java, of C++. Dan zullen de typen niet automatisch gecast worden, en stuit je zonder meer op problemen.
Hoe moet het dan wel?
Moeten is een groot woord. Het is misschien beter om 'zou behoren te gaan' te gebruiken
Volgens de HTML DOM level 1 Specificatie uit 1998 (!) bevat document.images een HTMLCollection object, en geen array, zoals wel vaak wordt gebruikt (als erfgoed van de pre-DOM-era). En de methode document.getElementsByTagName geeft een NodeList terug, en geen array.
Als je verder over het Document Object Model gaat lezen, ga je beseffen dat er eigenlijk helemaal nergens over array's gesproken wordt. Alleen over objecten, die wellicht intern array's of vectoren bevatten, maar die dat zelf niet zijn.
De voorbeelden die ik hierboven noemde, hadden volgens de DOM specificatie als volgt moeten zijn:
JavaScript:
1
2
| coll = document.getElementsByTagName('img'); alert(coll.item(3).src); |
en
JavaScript:
1
| document.images.namedItem('logo').src = 'w3c.png'; |
En dat werkt ook 'gewoon' in DOM compatible browsers. Dit werkt zo in alle scripting- en programmeertalen die met het Document Object Model overweg kunnen. Er zijn hooguit wat kleine veranderingen als een taal iets niet ondersteunt.
Wat zijn de gevolgen?
Dat vraag ik me nu dus af. Ik dacht altijd dat ik het zelf op de goede manier deed, maar nu blijkt toch dat bepaalde dingen die voor de hand lijken te liggen toch anders zijn. Op dit moment vind ik het moeilijk om te zeggen wat nu écht de goede methode is.
Met Javascripts zijn die array's vaak zo handig te gebruiken. Maar in feite is het de bedoeling om alle objecten via DOM methoden aan te spreken.
Toch ben ik daar nog niet helemaal uit.
Wat moet je anderen nu aanraden om te gaan gebruiken? Gaat het DOM model te ver op dit moment? Is het te omslachtig? Ik heb altijd gezegd dat afkorten een slechte gewoonte is, en met het echte DOM scripten krijg je vaak vreselijk lange statements.
De andere kant van het verhaal is dat je in andere talen dan Javascript vaak geen keuze hebt. Je krijgt onvermijdelijk compiler errors als je altijd gewend bent om iets in Javascript moet schrijven, en nu eens iets in bijvoorbeeld Java moet maken. Maar dat is juist iets waarvoor het Document Object Model bedoeld is. Het is universeel, en niet alleen bedoeld voor gebruik in webpagina's. Net als XML dus wel voortvloeiend vanuit de internet wereld, maar niet uitsluitend aarvoor bedoeld.
Maar gaan we niet hetzelfde krijgen als met HTML? De documentatie op het internet is sterk verouderd. Er zijn bijvoorbeeld nog genoeg tutorial pagina's die niet verder komen dan HTML 3.2. We klagen nu over de verschillen tussen de browsers, en backward compatibility.
Is het nu niet eens tijd om over te stappen naar 100% DOM scripting, dus zuiver en alleen methoden te gebruiken zoals vermeld in de DOM specificaties?
(Dit zou het einde betekenen voor properties als innerHTML, en zal échte kennis van het DOM model vereisen)
offtopic:
Excuses voor dit niet erg samenhangende geheel, het leek me interessant om eens een discussie hierover te voeren. Ik wist echter nog niet zeker welke kant ik daarmee op wilde
Excuses voor dit niet erg samenhangende geheel, het leek me interessant om eens een discussie hierover te voeren. Ik wist echter nog niet zeker welke kant ik daarmee op wilde