DOM
JAVASCRIPT JA DOM KOULUTUSTA VUONNA 2025!
Kurssit saatavilla kautta Suomen. Tule ja varaa oma koulutustapahtumasi
IT-koulutuksen asiantuntijasi, Koulutus- ja konsultointipalvelu KK Mediat
DOM-malli ja elementtien haku dokumenttipuusta
Kun haluat muokata mitä tahansa elementtiä verkkosivulla, kaikki lähtee liikkeelle document
-oliosta.
Se tarjoaa pääsyn sivun taustalla olevaan DOM-puuhun, ja mahdollistaa sen että voit kulkea sivun rakenteessa ylhäältä alaspäin.
Tämä lähestymistapa on modernin web-kehityksen perusta.
Elementtien etsimiseen DOMista on kaksi pääasiallista tapaa:
- Selaimen kokoelmaviittaus on selaimen muistissa ilman erillistä hakua dokumenttipuuhun.
- hakumetodit kyselevät DOM-puun rakennetta, minkä takia niiden käyttö voi olla raskaampaa - etenkin, jos sivulla on suuri määrä solmuja.
Kun elementti on haettu, sen muokkaaminen onnistuu sujuvasti käyttämällä DOM:n tarjoamia ominaisuuksia (kuten innerHTML
), metodeja (kuten setAttribute()
) ja kokoelmia (kuten style
).
document ja muut suorat kokoelmaviittaukset
Keskeisin ja yleisin suora kokoelmaviittaus on tietenkin document
. Se palauttaa viittauksen HTML- tai XML-dokumenttiin.
Käytännössä lähes kaikki DOM-viittaukset lähtevät liikkeelle tästä:
consolo.log(document.nodeType) // 9 eli Document
Muita DOM-mallia tukevia suoraviittauksia ovat:
document.documentElement
- viittaahtml
-elementtiin, palauttaaElementNode
:ndocument.head
- viittaa HTML:nhead
-elementtiin, palauttaaElementNode
:ndocument.body
- viittaa HTML:nbody
-elementtiin, palauttaaElementNode
:n
Esimerkisi:
document.body.children // palauttaa suorat lapsielementit (HTMLCollection)
Selaimissa on edelleen myös useita ns. legacy-viittauksia – jäänteitä ajalta ennen yhtenäisen DOM-määrittelyn voimaantuloa. Nämä viittaukset ovat nopeita käyttää, koska ne välttävät DOM-puun uudelleenhakua, mutta ne eivät noudata DOM API:n nykyaikaista rakennetta. Tästä syystä niiden käyttöä kannattaa harkita tarkoin.
document.title
- viittaa sivun otsikko, palauttaa tekstiarvon (ei node)document.forms
Kaikki form-elementit - palauttaa HTMLCollection (erikoisobjekti, ei Node)document.images
Kaikki img-elementit - palauttaa HTMLCollection (erikoisobjekti, ei Node)document.links
Kaikki linkit, joilla on href - palauttaa HTMLCollection (erikoisobjekti, ei Node)document.scripts
Kaikki script-elementit - palauttaa HTMLCollection (erikoisobjekti, ei Node)document.styleSheets
- palauttaa StyleSheetsListin (erikoisobjekti, ei node)
Lisäksi selaimet tukevat useita deprekoituja suoraviittauksia, kuten document.anchors
ja document.all
.
Näiden käyttämistä tulisi välttää kokonaan.
Hakumetodit
DOM tarjoaa useita hakumetodeja solmujen etsimiseen dokumentista. Näistä keskeisimmät ovat:
document.getElementById()
– Palauttaa elementin, jolla on annettu ID.document.getElementsByClassName()
– Hakee kaikki elementit, joilla on tietty luokka.document.querySelector()
- hakee ensimmäisen elementin, joka vastaa CSS-valitsintadocument.querySelectorAll()
- hakee kaiki elementit, jotka vastaavat CSS-valitsintadocument.getElementsByTagName()
– Hakee kaikki elementit, jotka vastaavat tiettyä HTML-tagin nimeä.
Minkä tahansa elementin hakeminen id:n perusteella
document.getElementById()
on yksi suoraviivaisimmista tavoista hakea yksittäinen elementti.
Se palauttaa vain yhden elementin, jonka id
-attribuutin arvo vastaa annettua arvoa.
let header = document.getElementById('header'); // Hakee elementin ID:llä 'header' - palauttaa yhden elementin
Minka tahansa elementin hakeminen class-namen perusteella
document.getElementsByClassName()
hakee kaikki elementit, joilla on määritetty tietty CSS-luokka.
Metodin paluuarvo on HTMLCollection
-objekti, joka sisältää kaikki löydetyt elementit.
let elements = document.getElementsByClassName('readalso'); // Hakee kaikki elementit, joilla on luokka 'readalso'
Minkä tahansa elementin hakeminen CSS-valitsimella
document.querySelector()
on yksi tehokkaimmista tavoista etsiä HTML-elementtejä JavaScriptillä.
Metodi käyttää CSS-valitsimia (kuten ID, luokka, elementtityyppi) elementtien paikallistamiseen.
Tämä metodi palauttaa ensimmäisen osuman.
let element = document.querySelector('#my'); // Hakee ID:llä 'my' varustetun elementin
Jos etsit useampia elementtejä, harkitse document.querySelectorAll()
metodia.
Se palauttaa NodeList
-objektin, joka sisältää kaikki CSS-valitsinta vastaavat elementit.
Huomioi, että querySelectorAll()
palauttaa nk. live-listauksen, eli elementtilistaus päivittyy automaattisesti aina kun DOM-puu muuttuu.
let element = document.querySelectorAll('p'); // hakee kaikki p-elementit
Minkä tahansa elementin hakeminen tagi-nimellä
document.getElementsByTagName()
hakee kaikki elementit, jotka vastaavat tiettyä HTML-tagin nimeä.
Metodin paluuarvo on HTMLCollection
-objekti, joka päivittyy automaattisesti, jos dokumenttiin lisätään tai poistetaan elementtejä, jotka vastaavat hakuehtoa.
let divs = document.getElementsByTagName('div'); // Hakee kaikki -elementit
Hakumetodien suorituskyky
Hakumetodit kyselevät DOM-puun rakennetta, minkä takia niiden käyttö voi olla raskaampaa etenkin jos sivulla on paljon solmuja.
Tästä syystä hakumetodeja käyttäessä kannattaa pohtia kuinka usein dokumenttipuu muuttuu, ja kuinka usein samaa hakua hyödynnetään.
Jos hakua hyödynnetään usein ja sivun rakenne on melko staattinen, suorituskykyä voidaan parantaa suorittamalla haku kerran ja tallettamalla sen tulos muuttujaan.
Luonnollisesti jos DOM-muuttuu, täytyy muuttujan arvo päivittää erikseen:
Esimerkiksi alla sama kysely kahdella eri tavalla toteutettuna. Jälkimmäinen kyselytapa on jopa 10x nopeampi.
Tämä havainnollistaa, kuinka pienilläkin muutoksilla koodissa voi olla merkittävä vaikutus suorituskykyyn.
// huono tapa:
if (document.querySelectorAll("p").length > 0) { // ensimmäinen haku
for (var i = 0; i < document.querySelectorAll("p").length; i++) { // 2. haku
document.querySelectorAll("p")[i].style.color = "red"; //n:th haku
}
}
// oikeaoppinen tapa:
let para = document.querySelectorAll("p"); // ensimmäinen ja viimeinen haku
if (para.length > 0) { // ensimmäinen haku
for (var i = 0; i < para.length; i++) {
para[i].style.color = "green";
}
}