Lekcja 4: Manipulacja DOM - Treść i Atrybuty

Po wybraniu elementów za pomocą selektorów, jQuery oferuje proste i potężne metody do odczytywania i modyfikowania ich treści oraz atrybutów. Pozwala to dynamicznie zmieniać wygląd i zawartość strony internetowej w odpowiedzi na działania użytkownika lub inne zdarzenia.

Odczytywanie i Ustawianie Treści HTML i Tekstowej

Praca z Wartościami Formularzy

Odczytywanie i Ustawianie Atrybutów i Właściwości

Istnieje subtelna różnica między atrybutami (attributes) a właściwościami (properties) elementów DOM:

W wielu przypadkach wartości atrybutów i właściwości są zsynchronizowane, ale nie zawsze. Szczególnie dla właściwości logicznych (boolean) jak checked, selected, disabled, zaleca się używanie .prop().

Kiedy używać .attr() a kiedy .prop()?

Zadanie praktyczne

Stwórz plik HTML zawierający:

Używając jQuery:

  1. Odczytaj i wyświetl w konsoli zawartość HTML paragrafu "info".
  2. Odczytaj i wyświetl w konsoli zawartość tekstową paragrafu "info".
  3. Zmień tekst linku "link-zew" na "Odwiedź Google".
  4. Zmień atrybut href linku "link-zew" na "https://google.com".
  5. Odczytaj i wyświetl w konsoli początkową wartość pola "nazwa".
  6. Zmień wartość pola "nazwa" na "Nowa wartość z jQuery".
  7. Sprawdź (zaznacz) checkbox "zgoda-marketingowa" używając .prop().
  8. Odczytaj i wyświetl w konsoli stan zaznaczenia checkboxa "zgoda-marketingowa" po zmianie.
  9. Usuń atrybut disabled z przycisku "wyslij" używając .removeAttr() (lub ustaw .prop(\'disabled\', false)).
Pokaż rozwiązanie

HTML:

<!DOCTYPE html>
<html>
<head>
    <title>Test Manipulacji DOM</title>
</head>
<body>
    <p id="info">To jest <strong>ważna</strong> informacja.</p>
    <input type="text" id="nazwa" value="Domyślna wartość"><br>
    <a id="link-zew" href="https://example.com">Stary link</a><br>
    <input type="checkbox" id="zgoda-marketingowa"> Zgoda marketingowa<br>
    <button id="wyslij" disabled>Wyślij</button>

    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
    <script>
        $(function() {
            // 1. Odczytaj HTML paragrafu
            let infoHtml = $("#info").html();
            console.log("1. HTML paragrafu:", infoHtml);

            // 2. Odczytaj tekst paragrafu
            let infoText = $("#info").text();
            console.log("2. Tekst paragrafu:", infoText);

            // 3. Zmień tekst linku
            $("#link-zew").text("Odwiedź Google");
            console.log("3. Zmieniono tekst linku.");

            // 4. Zmień href linku
            $("#link-zew").attr("href", "https://google.com");
            console.log("4. Zmieniono href linku.");

            // 5. Odczytaj wartość pola input
            let nazwaVal = $("#nazwa").val();
            console.log("5. Wartość pola \'nazwa\':", nazwaVal);

            // 6. Zmień wartość pola input
            $("#nazwa").val("Nowa wartość z jQuery");
            console.log("6. Zmieniono wartość pola \'nazwa\'. Nowa wartość:", $("#nazwa").val());

            // 7. Zaznacz checkbox
            $("#zgoda-marketingowa").prop("checked", true);
            console.log("7. Zaznaczono checkbox \'zgoda-marketingowa\'.");

            // 8. Odczytaj stan checkboxa
            let czyZgoda = $("#zgoda-marketingowa").prop("checked");
            console.log("8. Stan checkboxa \'zgoda-marketingowa\':", czyZgoda);

            // 9. Włącz przycisk
            // Sposób 1: .removeAttr()
            // $("#wyslij").removeAttr("disabled"); 
            // Sposób 2: .prop() - zalecany dla właściwości boolean
            $("#wyslij").prop("disabled", false);
            console.log("9. Włączono przycisk \'wyslij\'. Stan disabled:", $("#wyslij").prop("disabled"));
        });
    </script>
</body>
</html>

Zadanie do samodzielnego wykonania

Dodaj do HTML obrazek <img id="logo" src="stare-logo.png" alt="Stare Logo"> oraz listę rozwijaną <select id="kolor"><option value="czerwony">Czerwony</option><option value="zielony">Zielony</option></select>.

Używając jQuery:

  1. Zmień atrybut src obrazka na "nowe-logo.jpg".
  2. Zmień atrybut alt obrazka na "Nowe Logo Firmy".
  3. Odczytaj i wyświetl w konsoli wybraną wartość z listy rozwijanej "kolor".
  4. Ustaw programowo wybraną opcję w liście "kolor" na "zielony" (użyj .val()).
  5. Dodaj obrazkowi niestandardowy atrybut data-version="2.0" używając .attr().

FAQ - Manipulacja Treścią i Atrybutami w jQuery

Czy mogę użyć .html() lub .text() do dodania treści, zamiast zastępowania?

Metody .html() i .text() zastępują istniejącą zawartość. Do dodawania treści służą inne metody, takie jak .append() (dodaje na końcu), .prepend() (dodaje na początku), .before() (dodaje przed elementem) i .after() (dodaje po elemencie), które zostaną omówione w kolejnej lekcji.

Jak odczytać wartość atrybutu `data-*`?

Możesz użyć standardowej metody .attr(\'data-nazwa\'). jQuery oferuje również dedykowaną metodę .data(\'nazwa\'), która jest bardziej elastyczna – potrafi automatycznie konwertować typy (np. JSON zapisany w atrybucie) i przechowuje dane w pamięci podręcznej jQuery, co może być wydajniejsze przy wielokrotnym dostępie.

Co się stanie, gdy ustawię atrybut, który już istnieje, używając .attr()?

Istniejąca wartość atrybutu zostanie nadpisana nową wartością podaną w metodzie .attr(nazwa, nowaWartosc). Jeśli chcesz dodać wartość do istniejącego atrybutu (np. dodać klasę do atrybutu class), lepiej użyć dedykowanych metod jak .addClass().

Czy .val() działa dla wszystkich elementów formularza?

.val() działa poprawnie dla większości elementów formularza: input (różne typy), textarea, select. Dla checkboxów zwraca wartość atrybutu value tylko jeśli są zaznaczone (lepiej używać .prop(\'checked\') do sprawdzania stanu). Dla radio buttonów zwraca wartość zaznaczonego przycisku w grupie (trzeba użyć selektora :checked).

Czy zmiana właściwości przez .prop() zawsze aktualizuje atrybut w HTML?

Nie zawsze. Na przykład, zmiana właściwości value pola input przez .prop(\'value\', \'nowa\') lub przez wpisanie tekstu przez użytkownika zmieni wartość w obiekcie DOM, ale nie zaktualizuje atrybutu value widocznego w źródle HTML. Podobnie, .prop(\'checked\', true) zmieni stan zaznaczenia, ale niekoniecznie doda atrybut checked do HTML.