Lekcja 5: Manipulacja DOM - Dodawanie, Usuwanie i Zastępowanie Elementów
Oprócz modyfikowania treści i atrybutów istniejących elementów, jQuery dostarcza intuicyjnych metod do dynamicznego dodawania nowych elementów do DOM, usuwania istniejących oraz zastępowania jednych elementów innymi. To kluczowe umiejętności przy tworzeniu interaktywnych interfejsów użytkownika.
Dodawanie Elementów
Metody te pozwalają wstawiać nową treść (HTML, elementy DOM, obiekty jQuery) w różnych miejscach względem wybranych elementów.
-
.append(treść)
: Wstawiatreść
na końcu wewnętrznej zawartości każdego z wybranych elementów.// Dodanie nowego elementu listy na końcu ul $("ul#lista-produktow").append("<li>Nowy produkt</li>"); // Dodanie spana do wszystkich paragrafów $("p").append(" <span class=\'dodatek\'>(dodano)</span>");
-
.appendTo(cel)
: Działa odwrotnie do.append()
. Wstawia wybrane elementy na końcu wewnętrznej zawartości elementu(ów) podanych jakocel
.// Stworzenie nowego elementu i dodanie go do diva $("<p>Nowy akapit dodany przez appendTo.</p>").appendTo("#kontener"); // Przeniesienie istniejących elementów $("span.ikona").appendTo("div.naglowek"); // Przenosi ikony do nagłówka
-
.prepend(treść)
: Wstawiatreść
na początku wewnętrznej zawartości każdego z wybranych elementów.// Dodanie elementu na początku listy $("ul#lista-zadan").prepend("<li class=\'priorytet\'>Najważniejsze zadanie!</li>");
-
.prependTo(cel)
: Działa odwrotnie do.prepend()
. Wstawia wybrane elementy na początku wewnętrznej zawartości elementu(ów) podanych jakocel
.$("<h2>Ważna sekcja</h2>").prependTo("article#glowny");
-
.after(treść)
: Wstawiatreść
bezpośrednio po każdym z wybranych elementów (jako rodzeństwo).// Dodanie paragrafu po każdym obrazku $("img").after("<p class=\'podpis-obrazka\'>Podpis pod obrazkiem.</p>");
-
.insertAfter(cel)
: Działa odwrotnie do.after()
. Wstawia wybrane elementy bezpośrednio po elemencie(ach) podanych jakocel
.$("<hr>").insertAfter("h1"); // Wstawia linię poziomą po każdym h1
-
.before(treść)
: Wstawiatreść
bezpośrednio przed każdym z wybranych elementów (jako rodzeństwo).// Dodanie nagłówka przed każdą sekcją $("section").before("<h2>Nowa Sekcja</h2>");
-
.insertBefore(cel)
: Działa odwrotnie do.before()
. Wstawia wybrane elementy bezpośrednio przed elementem(ami) podanymi jakocel
.$("<div class=\'reklama\'>Reklama</div>").insertBefore("#stopka");
Argumenty treść
i cel
mogą być stringiem HTML, elementem DOM, tablicą elementów DOM lub obiektem jQuery.
Usuwanie Elementów
-
.remove(selektor)
: Usuwa wybrane elementy (wraz ze wszystkimi potomkami i powiązanymi danymi/zdarzeniami jQuery) z drzewa DOM. Można opcjonalnie podać selektor, aby usunąć tylko te elementy ze zbioru, które pasują do selektora.// Usunięcie elementu o ID "do-usuniecia" $("#do-usuniecia").remove(); // Usunięcie wszystkich paragrafów z klasą "stary" $("p").remove(".stary"); // Usunięcie wszystkich elementów li $("li").remove();
-
.detach(selektor)
: Działa podobnie do.remove()
, ale zachowuje wszystkie dane i zdarzenia powiązane z usuniętymi elementami przez jQuery. Jest to przydatne, jeśli planujesz później ponownie wstawić te elementy do DOM.let odlaczoneElementy = $(".tymczasowe").detach(); // ... wykonaj inne operacje ... $("#nowe-miejsce").append(odlaczoneElementy); // Ponowne wstawienie z zachowanymi danymi/zdarzeniami
-
.empty()
: Usuwa wszystkie dzieci (potomków) każdego z wybranych elementów, ale pozostawia same wybrane elementy. Skutecznie opróżnia element z zawartości.// Opróżnienie diva z zawartości $("#kontener").empty(); // Usunięcie wszystkich opcji z listy select $("select#kategorie").empty();
Zastępowanie Elementów
-
.replaceWith(nowaTreść)
: Zastępuje każdy z wybranych elementów podanąnowąTreścią
(string HTML, element DOM, obiekt jQuery). Usunięte elementy są zwracane przez metodę.// Zastąpienie wszystkich paragrafów nagłówkami h3 $("p").replaceWith("<h3>Zastąpiony paragraf</h3>"); // Zastąpienie diva innym, istniejącym elementem let istniejacyDiv = $("#inny-div"); $("#stary-div").replaceWith(istniejacyDiv); // #inny-div zostanie przeniesiony
-
.replaceAll(cel)
: Działa odwrotnie do.replaceWith()
. Zastępuje element(y) podane jakocel
wybranymi elementami.// Zastąpienie wszystkich elementów .placeholder nowym divem $("<div class=\'finalna-tresc\'>Finalna treść</div>").replaceAll(".placeholder");
Owijanie Elementów (Wrapping)
Metody te pozwalają opakować wybrane elementy w dodatkową strukturę HTML.
.wrap(strukturaHTML | element | funkcja)
: Owpakowuje każdy wybrany element indywidualnie w podaną strukturę.// Opakowanie każdego linku w element strong $("a").wrap("<strong></strong>"); // Opakowanie każdego inputa w div z klasą $("input").wrap("<div class=\'input-wrapper\'></div>");
.unwrap()
: Usuwa rodzica każdego z wybranych elementów, effectively "rozpakowując" je.// Usunięcie opakowującego <strong> z linków $("a").unwrap();
.wrapAll(strukturaHTML | element)
: Opakowuje wszystkie wybrane elementy razem, jako grupę, w pojedynczą strukturę.// Opakowanie wszystkich paragrafów w jeden div $("p").wrapAll("<div class=\'kontener-paragrafow\'></div>");
.wrapInner(strukturaHTML | element | funkcja)
: Opakowuje wewnętrzną zawartość (dzieci) każdego wybranego elementu w podaną strukturę.// Opakowanie treści każdego diva w span $("div").wrapInner("<span class=\'tresc-wewnetrzna\'></span>");
Zadanie praktyczne
Stwórz plik HTML z listą <ul id="lista"><li>Punkt 1</li><li>Punkt 2</li></ul>
oraz przyciskiem <button id="dodaj">Dodaj Punkt</button>
i drugim przyciskiem <button id="usun-ostatni">Usuń Ostatni</button>
.
Używając jQuery:
- Po kliknięciu przycisku "Dodaj Punkt", dodaj nowy element
<li>Nowy Punkt</li>
na końcu listy "lista" (użyj.append()
). - Po kliknięciu przycisku "Usuń Ostatni", usuń ostatni element
<li>
z listy "lista" (użyj selektora:last
i metody.remove()
). - Dodaj kod, który po załadowaniu strony opakuje całą listę
<ul>
w element<div class="lista-wrapper"></div>
(użyj.wrap()
lub.wrapAll()
). - Dodaj kod, który przed listą wstawi nagłówek
<h3>Moja Lista</h3>
(użyj.before()
).
Pokaż rozwiązanie
HTML:
<!DOCTYPE html>
<html>
<head>
<title>Test Dodawania/Usuwania</title>
<style>
.lista-wrapper { border: 1px solid blue; padding: 10px; margin-top: 10px; }
</style>
</head>
<body>
<button id="dodaj">Dodaj Punkt</button>
<button id="usun-ostatni">Usuń Ostatni</button>
<ul id="lista">
<li>Punkt 1</li>
<li>Punkt 2</li>
</ul>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<script>
$(function() {
// 3. Opakuj listę w div
$("#lista").wrap("<div class=\'lista-wrapper\'></div>");
console.log("Opakowano listę.");
// 4. Dodaj nagłówek przed listą (teraz przed wrapperem)
$(".lista-wrapper").before("<h3>Moja Lista</h3>");
console.log("Dodano nagłówek.");
// 1. Obsługa kliknięcia przycisku "Dodaj Punkt"
$("#dodaj").on("click", function() {
$("#lista").append("<li>Nowy Punkt</li>");
console.log("Dodano nowy punkt.");
});
// 2. Obsługa kliknięcia przycisku "Usuń Ostatni"
$("#usun-ostatni").on("click", function() {
// Sprawdź, czy są jakieś elementy li do usunięcia
if ($("#lista li").length > 0) {
$("#lista li:last").remove();
console.log("Usunięto ostatni punkt.");
} else {
console.log("Lista jest już pusta.");
}
});
});
</script>
</body>
</html>
Uwaga: Obsługa zdarzeń (.on("click", ...)
) zostanie szczegółowo omówiona w późniejszych lekcjach. Tutaj używamy jej do demonstracji dodawania/usuwania elementów w odpowiedzi na akcje użytkownika.
Zadanie do samodzielnego wykonania
Stwórz div z ID "komunikaty". Dodaj przycisk "Dodaj Komunikat" i przycisk "Wyczyść Komunikaty".
Używając jQuery:
- Po kliknięciu "Dodaj Komunikat", dodaj nowy paragraf
<p class="komunikat">Nowy komunikat!</p>
na początku diva "komunikaty" (użyj.prepend()
). - Po kliknięciu "Wyczyść Komunikaty", usuń całą zawartość diva "komunikaty" (użyj
.empty()
). - Dodaj kod, który po załadowaniu strony zastąpi wszystkie elementy
<span class="placeholder">
(jeśli takie istnieją na stronie) tekstem "(treść załadowana)" (użyj.replaceWith()
).
FAQ - Dodawanie, Usuwanie i Zastępowanie Elementów
Jaka jest różnica między .append()
a .appendTo()
?
Obie metody robią to samo (dodają element na końcu), ale różnią się składnią i tym, co zwracają. $("A").append("B")
dodaje B do A i zwraca A. $("B").appendTo("A")
dodaje B do A i zwraca B. Wybór zależy od tego, który element chcesz mieć dostępny do dalszego łańcuchowania.
Czy mogę dodawać elementy stworzone dynamicznie przez jQuery?
Tak. Możesz stworzyć nowy element jQuery (np. let nowyP = $("<p>Tekst</p>");
), dodać mu klasy, atrybuty, obsługę zdarzeń, a następnie wstawić go do DOM za pomocą metod takich jak .append()
, .prepend()
, .insertAfter()
itp.
Co się stanie, gdy użyję .remove()
na elemencie, który nie istnieje?
Nic się nie stanie. jQuery jest odporne na takie sytuacje. Jeśli selektor użyty przed .remove()
nie znajdzie żadnych elementów, metoda .remove()
po prostu nie będzie miała czego usunąć i nie spowoduje błędu.
Czy .empty()
usuwa sam element, czy tylko jego zawartość?
.empty()
usuwa tylko zawartość (wszystkie elementy potomne i tekst) wybranego elementu. Sam element pozostaje w drzewie DOM. Jeśli chcesz usunąć również sam element, użyj .remove()
.
Czy metody opakowujące (wrap) działają, jeśli element ma już rodzica?
Tak. Metody takie jak .wrap()
czy .wrapAll()
wstawią nową strukturę opakowującą pomiędzy wybrany element a jego obecnego rodzica. Element zostanie "przepięty" do nowej struktury opakowującej.