Jutro jest najbardziej zajętym dniem w roku.
DOM - Obiektowy Model Dokumentu

DOM (ang. Document Object Model, obiektowy model dokumentu) to API dla dokumentów (X)HTML. Wprowadza strukturalne odwzorowanie dokumentu, pozwalając modyfikować jego zawartość i warstwę prezentacji. Podsumowując, DOM łączy strony WWW ze skryptami lub innymi językami programowania.

DOM W3C jest podzielony na dwie części:

  1. Pierwsza, podstawowa (ang. core) to ogólny sposób reprezentowania dokumentów XML. Przedstawia dokument jako drzewo zawierające węzły (ang. node). Każdy węzeł może być elementem, fragmentem tekstu, komentarzem, instrukcją preprocesora (np. dołączonym fragmentem PHP) albo encją.
     
  2. Drugą częścią DOM W3C jest typowy dla przeglądarek DOM HTML. Jest to zestaw metod ułatwiających tworzenie dynamicznych stron oraz zapewniających kompatybilność wstecz z wcześniejszym prostym DOM Netscape. DOM HTML przedstawia dokument jako kilka kolekcji obiektów określonych typów (np. formularze, obrazki) oraz dodaje pola/metody ułatwiające dostęp do funkcjonalności specyficznej dla HTML, jak np. odczyt pól formularza.
     

Podstawowe obiekty

Głównym, globalnym obiektem w DOM przeglądarki jest window. W tym obiekcie przechowywane są wszystkie globalne zmienne i funkcje. W nim znajduje się także obiekt document, który reprezentuje całą stronę XHTML.

document.documentElement to jest główny element dokumentu (korzeń), czyli <html>.
document.body to obiekt reprezentujący <body> dokumentu.

 

Odnajdywanie elementów

Wszystkie metody DOM można wywołać dla dowolnego elementu dokumentu lub dla samego obiektu document.

Do elementów strony możemy odwoływać się na kilka sposobów:

  • Po identyfikatorze.

    Jeśli żądany element ma identyfikator (atrybut ID), to można go znaleźć za pomocą getElementById(id).
    Ponieważ ID elementu powinien być unikalny, to zwracany jest pierwszy element, którego atrybut id jest równy id. Np.:
        var obj = document.getElementById('myIdent');
        obj.style.color = "#ff0000";
        obj.style.backgroundColor = "#00ff00";
        obj.style.fontSize = "16px";
    		
  • Po nazwie.

    Jeśli żądany element ma nazwę (atrybut NAME), to można go znaleźć za pomocą getElementsByName(nazwa).
    W tym przypadku zwracana jest tablica wszystkich elementów na stronie, których atrybut name jest równy nazwa. Np.:
        var obj = document.getElementById('myName');
        for(var i=0 ; i < obj.length ; i++)
        {   alert("Element " + i + " to " + obj[i].tagName);
        }
    		
  • Po tagu (znaczniku).

    getElementsByTagName(tag) zwraca kolekcję wszystkich elementów danego typu (np. lunków lub komórek tabeli). Jeśli poda się * zamiast nazwy, to zwróci wszystkie elementy. Np.:
        var obj = document.getElementsByTagName('a');
        for(var i=0 ; i < obj.length ; i++)
        {   obj[i].style.color = "#ff0000";
        }
    		

    Tą metodę możesz wywołać dla dowolnego elementu i wtedy zwróci tylko elementy zawarte w podanym, np.:

        var tabela  = document.getElementById('mojaTabela');
        var komorki = tabela.getElementsByTagName('td');
        for(var i=0 ; i < komorki.length ; i++)
        {   komorki[i].style.color = "#ff0000";
        }
    		
    W tym przypadku zmienna komorki będzie kolekcją wszystkich komórek tablicy o ID = mojaTabela. Niezależnie od tego, ile tabel będzie na stronie, to zmiana koloru na czerwony nastąpi tylko w komórkach tej tabeli.

 

Zmiana wyglądu elementów

DOM umożliwia zmianę wyglądu elementów na stronie. Można to zrobić za pomocą stylów, np.:

    var obj = document.getElementsByTagName('p');
    for(var i=0 ; i < obj.length ; i++)
    {   obj[i].style.color = "green";
	    obj[i].style.backgroundColor = "red";
        obj[i].style.fontSize = "14px";
    }
	

Jeżeli a stylach mamy zdefiniowane klasy, to można to samo zrobić prościej korzystając z definicji klasy CSS, np.:

    var obj = document.getElementsByTagName('p');
    for(var i=0 ; i < obj.length ; i++)
    {   obj[i].className = "mojaKlasaCSS";
    }
	

Przemieszczanie się po elementach strony

Żeby trafić indywidualnie do każdego elementu dokumentu nie musisz nadawać każdemu z nich identyfikatorów. Każdy element (czyli tag) posiada metody wskazujące na jego sąsiednie elementy (tagi):

Nazwa metody Zwracana wartość
firstChild pierwszy element zawarty w bieżącym elemencie
lastChild ostatni element w bieżącym elemencie
previousSibling sąsiedni element poprzedzający bieżącym elementem
nextSibling sąsiedni element za bieżącym elementem
parentNode element nadrzędny, w którym zawarty jest bieżącym element
childNodes kolekcja wszystkich elementów zawartych w bieżącym elemencie

Zwracana wartość może być równa null, jeżeli nie ma elementu, który by mogła wskazywać.

Domyślnie pola te wskazują na dowolne węzły, łącznie z tekstem i komentarzami w dokumencie. Elementy od innych węzłów można odróżnić za pomocą pola nodeType. np.:

    if (obj.nextSibling && obj.nextSibling.nodeType == 1)
    {   alert('Sąsiedni węzeł jest elementem');
    }

Poniżej masz pełną listę typów:

Stała Wartość
ELEMENT_NODE 1
ATTRIBUTE_NODE 2
TEXT_NODE 3
CDATA_SECTION_NODE 4
ENTITY_REFERENCE_NODE 5
ENTITY_NODE 6
PROCESSING_INSTRUCTION_NODE 7
COMMENT_NODE 8
DOCUMENT_NODE 9
DOCUMENT_TYPE_NODE 10
DOCUMENT_FRAGMENT_NODE 11
NOTATION_NODE 12

 

Atrybuty elementów

Dla każdego z elementów strony możemy:

  • odczytać dowolny atrybut za pomocą getAttribute(nazwa);
     
  • sprawdzić czy element posiada jakiś atrybut za pomocą hasAttribute(nazwa);
     
  • dodać nowy lub zmienić istniejący atrybut za pomocą setAttribute(nazwa, wartość);
     
  • usunąć istniejący atrybut za pomocą removeAttribute(nazwa).
     
    <p align="center" title="Mój akapit" id="akapit" style="colot:red">Tekst akapitu...</p>
    
    ..........................
    
    var p = document.getElementById('akapit');
    
    // wyświetlamy wartość atrybutu TITLE
    var pTitle = p.getAttribute('title');
    alert(pTitle);
    
    // sprawdzamy, czy istnieje atrybut CLASS
    var pClassName = p.hasAttribute('class');
    alert(pClassName); 

    // nadpisze atrybut ALIGN
    p.setAttribute("align", "right");

    // stworzy nowy atrybut i przypisze mu wartość
    p.setAttribute("lang", "pl");

    // usuwamy atrybut STYLE
    p.removeAttribute("style");

 

Usuwanie elementów

Każdy element posiada metodę removeChild pozwalającą usunąć jeden z zawartych w nim węzłów, np.:

    // element usunie się sam:
    element.parentNode.removeChild(element);

 

Dodawanie nowych elementów

Nowe elementy tworzymy przez metodę document.createElement(tag). Stworzony element nie jest automatycznie wyświetlany w dokumencie. Trzeba go dodać za pomocą metody appendChild lub insertBefore.

    // wstawiamy nowy akapit na końcu dokumentu
    var p = document.createElement("p");
    p.innerHTML = "<b>Tekst w nowym akapicie...</b>";
    document.body.appendChild(p);
	
    // wstawiamy nowy blok przed wybranym elementem
    var div = document.createElement("div");
    div.innerHTML = "<b>Tekst we wstawionym DIVie...</b>";
    var obj = document.getElementById("wstawPrzed");
    document.insertBefore(div, obj);

Wykonanie appendChild lub insertBefore na elementach, które są już w dokumencie, przeniesie je automatycznie w nowe miejsce.

Tekst tworzy się za pomocą document.createTextNode("tekst") i podobnie jak elementy trzeba go wstawić do dokumentu, żeby stał się widoczny, np.:

    var t = document.createTextNode("Dodatkowy tekst w akapicie.");
    var p = document.getElementById("akapit");
    p.appendChild(t);
« wstecz   dalej »