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.

Argumenty treść i cel mogą być stringiem HTML, elementem DOM, tablicą elementów DOM lub obiektem jQuery.

Usuwanie Elementów

Zastępowanie Elementów

Owijanie Elementów (Wrapping)

Metody te pozwalają opakować wybrane elementy w dodatkową strukturę HTML.

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:

  1. Po kliknięciu przycisku "Dodaj Punkt", dodaj nowy element <li>Nowy Punkt</li> na końcu listy "lista" (użyj .append()).
  2. Po kliknięciu przycisku "Usuń Ostatni", usuń ostatni element <li> z listy "lista" (użyj selektora :last i metody .remove()).
  3. Dodaj kod, który po załadowaniu strony opakuje całą listę <ul> w element <div class="lista-wrapper"></div> (użyj .wrap() lub .wrapAll()).
  4. 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:

  1. Po kliknięciu "Dodaj Komunikat", dodaj nowy paragraf <p class="komunikat">Nowy komunikat!</p> na początku diva "komunikaty" (użyj .prepend()).
  2. Po kliknięciu "Wyczyść Komunikaty", usuń całą zawartość diva "komunikaty" (użyj .empty()).
  3. 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.