MODUŁ 11
Dynamiczne tworzenie i usuwanie elementów DOM
PPrezentacja dla nauczyciela
Zamiast ograniczać się do elementów przygotowanych na stałe w kodzie HTML, aplikacje internetowe generują treść na żywo: dopisują nowe komentarze, renderują karty katalogu z danych i usuwają wybrane pozycje z koszyka. W tym module opanujesz metody programowego tworzenia, wstawiania oraz usuwania węzłów DOM.
Tworzenie i dołączanie elementów createElement
Dynamiczne rozbudowywanie strony o nowe pozycje (np. dodawanie wpisów na forum, kolejnych zadań czy produktów) opiera się na tworzeniu węzłów DOM za pomocą metody document.createElement(nazwaZnacznika).
Nowo utworzony element istnieje początkowo wyłącznie w pamięci operacyjnej przeglądarki i nie jest jeszcze widoczny w oknie strony. Przed dołączeniem go do dokumentu konfigurujemy jego właściwości: przypisujemy tekst za pomocą element.textContent, nadajemy klasy CSS przez element.className lub modyfikujemy inne atrybuty.
Aby element pojawił się w strukturze strony, musimy wstawić go do wybranego kontenera nadrzędnego (np. listy <ul> lub bloku <div>) za pomocą metody rodzic.appendChild(nowyElement). Metoda ta dołącza węzeł na samym końcu listy dzieci danego kontenera.
function dodajNowyWpis() {
const pole = document.getElementById('trescWpisu');
const tekst = pole.value.trim();
if (tekst === '') {
alert('Wpis nie może być pusty!');
return;
}
const lista = document.getElementById('listaWiadomosci');
const nowyWpis = document.createElement('li');
nowyWpis.textContent = tekst;
lista.appendChild(nowyWpis);
pole.value = '';
}
Generowanie struktur w pętli i czyszczenie kontenera
Przy budowaniu katalogów produktów, cenników czy tabel z danymi najczęściej powtarzamy operację tworzenia elementów w pętli (np. metodą tablica.forEach()). Dla każdego obiektu z danymi tworzymy zestaw węzłów, łączymy je w spójny kafelek i wstawiamy do wspólnego kontenera.
Kluczową zasadą higieny interfejsu przed ponownym generowaniem treści (np. po kliknięciu przycisku odświeżenia lub zmiany filtra) jest wyczyszczenie dotychczasowej zawartości kontenera. Najszybciej osiągamy to przypisaniem pustego ciągu znaków: kontener.innerHTML = ''.
Gdy liczba elementów nie wynika z tablicy, lecz z wartości podanej przez użytkownika, wygodniej użyć klasycznej pętli for z licznikiem. Nagłówek pętli ma trzy części: inicjalizację licznika, warunek wykonywania i krok po każdym obrocie — blok powtarza się tak długo, jak warunek jest prawdziwy:
const ile = parseInt(document.getElementById('ilePunktow').value, 10);
for (let i = 1; i <= ile; i++) {
const punkt = document.createElement('li');
punkt.textContent = 'Punkt ' + i;
lista.appendChild(punkt);
}
Pominięcie czyszczenia kontenera spowodowałoby dopisywanie kolejnych kopii elementów poniżej już istniejących za każdym razem, gdy użytkownik wywoła funkcję generującą.
const uslugi = [
{ nazwa: 'Instalacja systemu', cena: 80 },
{ nazwa: 'Czyszczenie układu', cena: 120 },
{ nazwa: 'Odzyskiwanie danych', cena: 250 }
];
function generujKartyUslug() {
const kontener = document.getElementById('kontenerUslug');
kontener.innerHTML = '';
uslugi.forEach(function(u) {
const karta = document.createElement('div');
karta.className = 'karta-uslugi';
const tytul = document.createElement('h4');
tytul.textContent = u.nazwa;
const cena = document.createElement('p');
cena.className = 'cena';
cena.textContent = u.cena + ' zł';
karta.appendChild(tytul);
karta.appendChild(cena);
kontener.appendChild(karta);
});
}
function wyczyscKatalog() {
document.getElementById('kontenerUslug').innerHTML = '';
}
Usuwanie elementów z drzewa dokumentu
Usuwanie elementów jest nieodzownym elementem interfejsów takich jak koszyki zakupowe czy listy zadań. Nowoczesny standard DOM udostępnia prostą metodę element.remove(), którą wywołujemy bezpośrednio na węźle, który ma zniknąć ze strony.
Gdy przycisk usuwania znajduje się wewnątrz usuwanego wiersza (np. w elemencie <li>), możemy przekazać referencję do klikniętego przycisku za pomocą słowa kluczowego this w atrybucie zdarzenia: onclick="usunPozycje(this)". Wewnątrz funkcji odwołujemy się do rodzica przez przycisk.parentElement i wywołujemy na nim metodę remove().
Po usunięciu węzła warto zaktualizować stan powiązanych liczników na stronie (np. zliczając pozostałe elementy za pomocą document.querySelectorAll('ul li').length) lub przeliczyć sumę zamówienia.
function usunPozycje(przycisk) {
const elementLi = przycisk.parentElement;
elementLi.remove();
const pozostalo = document.querySelectorAll('#listaKoszyka li').length;
const licznik = document.getElementById('licznikKoszyka');
licznik.textContent = 'Pozycji w koszyku: ' + pozostalo;
}
Ćwiczenia
- 1Tworzenie i dodawanie elementu li do listyUtwórz nowy znacznik li za pomocą createElement i dołącz go do listy ul.Zadanie i podpowiedzi →
- 2Czyszczenie pola tekstowego po dodaniu wpisuDodaj element do listy zadan i zresetuj zawartość pola input do pustego ciągu.Zadanie i podpowiedzi →
- 3Ignorowanie pustych wpisów przy dodawaniuZabezpiecz listę przed dodawaniem pustych elementów sprawdzając warunek trim() !== ''.Zadanie i podpowiedzi →
- 4Tworzenie akapitu z klasą CSSUtwórz element p, nadaj mu klasę komentarz za pomocą classList.add i dołącz do kontenera.Zadanie i podpowiedzi →
- 5Czyszczenie zawartości kontenera przez innerHTMLUsuń wszystkie elementy potomne kontenera przypisując pusty ciąg znaków do innerHTML.Zadanie i podpowiedzi →
- 6Generowanie elementów listy w pętli forWygeneruj określoną liczbę elementów li za pomocą pętli for i dołącz je do listy.Zadanie i podpowiedzi →
- 7Usuwanie elementu metodą element.removeUsuń element bezpośrednio z drzewa dokumentu za pomocą nowoczesnej metody remove().Zadanie i podpowiedzi →
- 8Usuwanie potomka metodą parent.removeChildUsuń wskazany element potomny korzystając z klasycznej metody removeChild rodzica.Zadanie i podpowiedzi →
- 9Usuwanie klikniętego elementu listy za pomocą this.removePrzypisz obsługę zdarzenia do każdego elementu listy tak, aby kliknięcie usuwało dany element.Zadanie i podpowiedzi →
- 10Dynamiczny element z własnym przyciskiem usuwaniaTwórz elementy listy z dołączonym przyciskiem 'Usuń', który kasuje dany wiersz.Zadanie i podpowiedzi →
- 11Dynamiczne tworzenie odnośnika z atrybutamiWygeneruj znacznik a z atrybutami href i target=_blank oraz dodaj go do kontenera.Zadanie i podpowiedzi →
- 12Dynamiczne tworzenie wierszy tabeli tr i tdZbuduj nowy wiersz tabeli z dwiema komórkami i dołącz go do elementu tbody.Zadanie i podpowiedzi →
- 13Usuwanie ostatniego elementu listyZaimplementuj mechanizm cofania operacji usuwający ostatni element potomny z listy.Zadanie i podpowiedzi →
- 14Wstawianie elementu na początku listy (prepend)Wstaw nowy element o wysokim priorytecie na sam początek listy za pomocą metody prepend.Zadanie i podpowiedzi →
- 15Licznik pozycji na żywo po operacji dodaniaAktualizuj tekstowy licznik elementów listy na podstawie właściwości children.length.Zadanie i podpowiedzi →
- 16Interaktywny menedżer listy z przełączaniem stanuZbuduj aplikację listy zadań z przełączaniem klasy ukończenia na kliknięcie elementu.Zadanie i podpowiedzi →