WWW-ohjelmointi

HTML-dokumentin käsittely

Javascriptin document-elementiltä löytyvät kaikki tarvittavat metodit DOM-puun manipulointiin.

Elementtien etsiminen

Dokumenttipuusta voi etsiä haluamaansa HTML-elementtiä useammalla tavalla. Jos puun rakenne on tiedossa, sitä pitkin voi edeta elementistä toiseen children- ja parentElement-ominaisuuksia käyttämällä. HTML-elementin children on aina taulukon kaltaisena objekti, jossa ovat kyseisen elementin lapsielementit. Halutun lapsen voi valita hakasulkumerkintää ja indeksinumeroa käyttämällä. Elementin parentElement puolestaan on aina kyseisen HTML-elementin vanhempana oleva elementti.

var element = document.body.children[2];        // <body>-elementin kolmas lapsielementti
element.parentElement;                          // <body>-elementti

Usein ei kuitenkaan ole järkevää yrittää edetä puuta juuresta lähtien askel kerrallaan vaan on kannattavampaa yrittää etsiä haluttu elementti suoraan esimerkiksi id-attribuutin, tagin nimen taikka luokan perusteella. Näitä varten document-objektissa, ja kaikissa muissa HTML-elementtiobjekteissa, on joukko metodeja, jotka palauttavat tyypillisesti joko yhden HTML-elementin tai useamman elementin taulukkoa muistuttavina HTMLCollection- ja NodeList-objekteina.

Nämä metodit etsivät halutun kaltaisia elementtejä metodin kutsumiseen käytetyn elementin lapsista.

Metodi Tehtävä Esimerkki Palauttaa
getElementById() Etsi sellainen, jonka id on pyydetty. var menu = document.getElementById('menu') HTML-elementti
getElementsByTagName() Etsi kaikki pyydetyt tagit. var form = document.getElementsByTagName('form') HTMLCollection
getElementsByClassName() Etsi kaikki kysyttyä luokkaa olevat. menu.getElementsByClassName('current') HTMLCollection
getElementsByName() Etsi name-attribuutilla. document.getElementsByName('osoite') NodeList
querySelector() Etsi ensimmäinen, joka vastaa annettua CSS-valitsinta. menu.querySelector('.current') HTML-elementti / null
querySelectorAll() Etsi kaikki, jotka vastaavat annettua CSS-valitsinta. content.querySelectorAll('p a[target="_blank"]') NodeList

Elementtien attribuutit

Kun HTML-elementti on saatu etsittyä objektina, sen attribuutteja voidaan tutkia ja muokata käyttämällä sen getAttribute()- ja setAttribute()-metodeja.

<!DOCTYPE html>
<html>
    <head lang="fi-fi">
        <title>Otsikko</title>
        <meta charset="utf-8">
        <style>
            h1 {color: red;}
        </style>
    </head>
    <body id="etusivu" class="sivu maanantai">
        <header> ... </header>
        <nav> ... </nav>
        <aside class="sivujuttu"> ... </aside>
        <article> ... </article>
        <footer> ... </footer>
    </body>
</html>
var body = document.body;
var id = body.getAttribute('id');                // "etusivu"
var luokat = body.getAttribute('class');         // "sivu maanantai"
body.setAttribute('id', 'takasivu');
var kieli = document.head.getAttribute('lang');  // 'fi-fi'

Elementin class-attribuutti löytyy lisäksi merkkijonona elementin ominaisuudesta className. Elementin class-attribuutissa määritellyt luokat ovat lisäksi käsiteltävissä elementin ominaisuudessa classList, johon voi lisätä luokkia add()-metodilla, poistaa niitä remove()-metodilla sekä nykyisen tilanteen mukan lisätä tai poistaa toggle()-metodilla. toggle() palauttaa samalla totuusarvon sen mukaan, lisättiinkö (true) vai poistettiinko (false) luokka.

Lisäksi classList-ominaisuudella on metodi contains(), jolla voi tarkistaa, onko elementillä kysytty luokka. Metodi palauttaa totuusarvon.

var body = document.body;
body.className;                   // "sivu maanantai"
body.classList;                   // DOMToken [ "sivu", "maanantai" ]
body.classList.add('testi');      // body.className = "sivu maanantai testi"
body.classList.remove('sivu');    // body.className = "maanantai testi"
body.classList.toggle('sivu');    // true, body.className = "sivu maanantai testi"
body.classList.contains('testi'); // true

Elementin sisältö

Käsillä olevan HTML-elementin HTML-muotoisen tekstisisältöä voi tutkia ja muokata sen ominaisuudella innerHTML. Tämä ominaisuus sisältää elementin sisällä olevan HTML-teksti merkkijonona. innerHTML-merkkijonon muuttaminen muuttaa kyseisen elementin sisällön.

...
<div id="sisalto">
    <p>Lorem ipsum <span>sit dolor</span> amet</p>
</div>
...
var sisus = document.getElementById('sisalto');
sisus.innerHTML;                            // "    <p>Lorem ipsum <span>sit dolor</span> amet</p>"
var sisempi = sisus.querySelector('span');
sisempi.innerHTML;                          // "sit dolor"
sisempi.innerHTML = "SIT DOLOR";
sisus.innerHTML;                            // "    <p>Lorem ipsum <span>SIT DOLOR</span> amet</p>"

Samaan tapaan toimii eleemntin outerHTML-ominaisuus, mutta se on merkkijono, joka sisältää myös elementin oman tagin.

sisus.outerHTML;
// "<div id="sisalto">
//     <p>Lorem ipsum <span>sit dolor</span> amet</p>
//  </div>"

Luonti, lisääminen ja poisto

HTML-dokumentin sisältöä voi muokata syöttämällä merkkijonona HTML-kieltä suoraan jonkin HTML-elementin sisällöksi innerHTML-ominaisuuden kautta. Usein on kuitenkin hyödyllistä hieman hienovaraisemmin vain lisätä tai poistaa yksittäisiä elementtejä.

Uuden elementin voi luoda document-objektin createElement()-metodilla. Luonnin jälkeen uudelle elementille voidaan antaa halutut attribuutit ja sisältö.

var skripti = document.createElement('script');
skripti.setAttribute('type', 'text/javascript');
skripti.setAttribute('src', 'http://petrit.net/www-kurssi/skriptit/omaskripti.js');

var otsikko = document.createElement('h1');
otsikko.setAttribute('class', 'paaotsikko important');
otsikko.innerHTML = 'Otsikon teksti';

Lopuksi uusi elementti lisätään DOM-puuhun haluttuun kohtaan. Lisätään edellä luotu skripti-muuttujaan tallennettu <script>-elementti dokumentin <head>-osion viimeiseksi ja lisätään otsikko-muuttujaan tallennettu <h1>-elementti <body>-osioon ensimmäiseksi (ennen nykyistä ensimmäistä elementtiä).

document.head.appendChild(skripti);

var body = document.body;
var eka = body.children[0];
body.insertBefore(otsikko, eka);

HTML-elementin voi poistaa DOM-puusta remove()-metodilla.

var sisalto = document.querySelector('#sisalto');
sisalto.remove();