DOM i jego znaczenie
Wprowadzenie
Dział zatytułowany „Wprowadzenie”DOM (Document Object Model) to interfejs programistyczny reprezentujacy strukture dokumentu HTML jako drzewo obiektow. Dzieki DOM, JavaScript może dynamicznie modyfikować zawartosc, strukture i style strony internetowej.
Każdy element HTML staje się obiektem (węzłem), który można odczytywać, modyfikować lub usuwać za pomoca JavaScript. DOM stanowi most miedzy statycznym kodem HTML a dynamicznymi interakcjami na stronie.
Kluczowe pojecia
Dział zatytułowany „Kluczowe pojecia”Czym jest DOM?
Dział zatytułowany „Czym jest DOM?”- Nie jest czescia JavaScript - to API przegladarki
- Nie jest tym samym co HTML - HTML to tekst, DOM to obiektowa reprezentacja
- Jest dynamiczny - zmiany w DOM natychmiast widac na stronie
Typy węzłów (Node Types)
Dział zatytułowany „Typy węzłów (Node Types)”- Element - tag HTML (div, p, span)
- Text - tekst wewnatrz elementu
- Attribute - atrybut elementu (class, id)
- Document - korzen drzewa DOM
- Comment - komentarz HTML
Struktura drzewa DOM
Dział zatytułowany „Struktura drzewa DOM” document │ <html> / \ <head> <body> │ / \ <title> <div> <footer> │ <p> / \ "Tekst" <span>Przykładowy HTML:
<!DOCTYPE html><html> <head> <title>Strona</title> </head> <body> <div id="container"> <p class="text">Tekst <span>ważny</span></p> </div> <footer>Stopka</footer> </body></html>Metody selekcji elementow
Dział zatytułowany „Metody selekcji elementow”Selekcja pojedynczego elementu
Dział zatytułowany „Selekcja pojedynczego elementu”// Po ID - zwraca jeden element lub nullconst container = document.getElementById('container');
// Po selektorze CSS - zwraca pierwszy pasujacyconst paragraph = document.querySelector('.text');const header = document.querySelector('h1');Selekcja wielu elementow
Dział zatytułowany „Selekcja wielu elementow”// Wszystkie elementy z klasa - zwraca HTMLCollection (live)const items = document.getElementsByClassName('item');
// Wszystkie elementy po tagu - zwraca HTMLCollectionconst divs = document.getElementsByTagName('div');
// Po selektorze CSS - zwraca NodeList (static)const buttons = document.querySelectorAll('button.primary');Manipulacja trescia
Dział zatytułowany „Manipulacja trescia”Odczyt i zmiana tekstu
Dział zatytułowany „Odczyt i zmiana tekstu”const element = document.querySelector('#info');
// Pobierz tekst (bez tagow HTML)console.log(element.textContent);
// Zmien tekstelement.textContent = 'Nowy tekst';
// innerHTML - interpretuje tagi HTML (uwaga na XSS!)element.innerHTML = '<strong>Pogrubiony</strong> tekst';Atrybuty elementow
Dział zatytułowany „Atrybuty elementow”const link = document.querySelector('a');
// Odczyt atrybutuconsole.log(link.getAttribute('href'));console.log(link.href); // bezposredni dostep
// Ustawienie atrybutulink.setAttribute('target', '_blank');link.href = 'https://example.com';
// Usuniecie atrybutulink.removeAttribute('target');
// Sprawdzenie istnieniaif (link.hasAttribute('disabled')) { console.log('Link wyłączony');}Klasy CSS
Dział zatytułowany „Klasy CSS”const box = document.querySelector('.box');
// Dodaj klasebox.classList.add('active');
// Usun klasebox.classList.remove('hidden');
// Przełącz (toggle) - dodaj jeśli nie ma, usun jeśli jestbox.classList.toggle('selected');
// Sprawdz czy zawieraif (box.classList.contains('active')) { console.log('Box jest aktywny');}Tworzenie i usuwanie elementow
Dział zatytułowany „Tworzenie i usuwanie elementow”Tworzenie nowych elementow
Dział zatytułowany „Tworzenie nowych elementow”// Utworz nowy elementconst newDiv = document.createElement('div');newDiv.textContent = 'Nowy element';newDiv.classList.add('card');
// Dodaj do dokumentudocument.body.appendChild(newDiv);
// Wstaw przed innym elementemconst container = document.querySelector('#container');const reference = document.querySelector('#reference');container.insertBefore(newDiv, reference);Usuwanie elementow
Dział zatytułowany „Usuwanie elementow”const element = document.querySelector('.to-remove');
// Nowoczesna metodaelement.remove();
// Starsza metoda (przez rodzica)element.parentNode.removeChild(element);Obsługa zdarzen (Events)
Dział zatytułowany „Obsługa zdarzen (Events)”Dodawanie listenera
Dział zatytułowany „Dodawanie listenera”const button = document.querySelector('button');
button.addEventListener('click', function(event) { console.log('Kliknieto przycisk!'); console.log('Target:', event.target);});
// Funkcja strzałkowabutton.addEventListener('click', (e) => { e.preventDefault(); // Zapobiegaj domyslnej akcji});Popularne zdarzenia
Dział zatytułowany „Popularne zdarzenia”| Zdarzenie | Kiedy wystepuje |
|---|---|
| click | Klikniecie elementu |
| submit | Wysłanie formularza |
| input | Zmiana wartości input |
| keydown | Nacisniecie klawisza |
| mouseover | Najechanie myszka |
| load | Załadowanie strony |
Event Delegation (delegacja zdarzen)
Dział zatytułowany „Event Delegation (delegacja zdarzen)”// Zamiast dodawać listener do każdego buttona// Dodajemy jeden do rodzica
document.querySelector('#lista').addEventListener('click', (e) => { if (e.target.matches('button.delete')) { e.target.closest('li').remove(); }});Reflow i Repaint
Dział zatytułowany „Reflow i Repaint”Definicje
Dział zatytułowany „Definicje”- Reflow - ponowne obliczenie layoutu (pozycje, rozmiary)
- Repaint - ponowne rysowanie elementow (kolory, cienie)
Optymalizacja
Dział zatytułowany „Optymalizacja”// Źle - wiele reflowfor (let i = 0; i < 100; i++) { document.body.innerHTML += '<div>Item</div>';}
// Dobrze - jeden reflowconst fragment = document.createDocumentFragment();for (let i = 0; i < 100; i++) { const div = document.createElement('div'); div.textContent = 'Item'; fragment.appendChild(div);}document.body.appendChild(fragment);Najczestsze błędy
Dział zatytułowany „Najczestsze błędy”// Zawsze sprawdzaj czy element istniejeconst element = document.getElementById('może-nie-istniec');if (element) { element.textContent = 'OK';}Podsumowanie
Dział zatytułowany „Podsumowanie”- DOM to obiektowa reprezentacja dokumentu HTML
- Przegladarka tworzy DOM z kodu HTML
- JavaScript manipuluje DOM przez API przegladarki
- Selekcja elementow: getElementById, querySelector, querySelectorAll
- Manipulacja: textContent, innerHTML, classList, setAttribute
- Zdarzenia obsługujemy przez addEventListener
- Optymalizuj operacje DOM aby unikac wielu reflow
MDN: DOM Dokumentacja DOM API
JavaScript.info: DOM Interaktywny kurs DOM
DOM Enlightenment Książka o DOM (darmowa online)