← Lekcje
JavaScript · lekcja 23

podmieniamy atrybut - src, class

Plan tematu (6 godzin):

  1. Godzina 1: DOM (obiektowy model dokumentu) - strona jako drzewo obiektów
  2. Godzina 2: znajdujemy element na stronie
  3. Godzina 3: zmieniamy tekst i wygląd elementu
  4. Godzina 4 (dziś): podmieniamy atrybut - src, class
  5. Godzina 5: dodajemy nowy element na stronę
  6. Godzina 6: powtórka - łączymy wyszukiwanie, zmianę i tworzenie
Rozgrzewka · 3 minuty

Rozgrzewka: tekst i wygląd z poprzedniej lekcji

  1. Co robi innerHTML, gdy przypiszecie mu nowy tekst?
  2. Czym różni się zmiana przez innerHTML od zmiany przez style.color?
  3. Jak w HTML podpiąć funkcję JavaScript pod kliknięcie przycisku?
Część 1 · Odczytujemy atrybut: getAttribute

getAttribute: odczytujemy wartość atrybutu

Znacznik HTML może mieć atrybuty - src (źródło obrazka), class (klasa), id i inne - zapisane wprost w kodzie jako name="value". Metoda element.getAttribute("name") odczytuje aktualną wartość podanego atrybutu z elementu, który już znaleźliście w DOM (np. przez getElementById).

<img id="photo" src="image-a.svg" alt="Ilustracja A">
const picture = document.getElementById("photo");
console.log(picture.getAttribute("src")); // result wg MDN: "image-a.svg"

Jeśli element nie ma podanego atrybutu, getAttribute nie zgłasza błędu - zwraca null (pustą wartość, brak atrybutu).

MDN, Web/API/Element/getAttribute: „The getAttribute() method of the Element interface returns the string value of the specified attribute of the specified element. It returns null if the element doesn't have an attribute with the given name.” - „Metoda getAttribute() interfejsu Element zwraca wartość tekstową podanego atrybutu podanego elementu. Zwraca null, jeśli element nie ma atrybutu o podanej nazwie.” (tłum. własne)
Część 2 · Zmieniamy atrybut: setAttribute

setAttribute: ustawiamy nową wartość atrybutu

Metoda element.setAttribute("name", "value") ustawia nową wartość atrybutu. Jeśli atrybut już istnieje, zostaje zaktualizowany - jeśli nie istnieje, zostaje dodany.

przed A src= "image-a.svg" picture.setAttribute( "src", "image-b.svg") po B src= "image-b.svg"
function swapImage() {
  const picture = document.getElementById("photo");
  picture.setAttribute("src", "image-b.svg");
}
MDN, Web/API/Element/setAttribute: „setAttribute() sets the value of an attribute on the specified element. If the attribute already exists, the value is updated; otherwise a new attribute is added with the specified name and value.” - „setAttribute() ustawia wartość atrybutu na podanym elemencie. Jeśli atrybut już istnieje, wartość zostaje zaktualizowana - jeśli nie, zostaje dodany nowy atrybut o podanej nazwie i wartości.” (tłum. własne)
Część 3 · getAttribute("src") kontra element.src

getAttribute("src") kontra element.src

Wartość atrybutu src można odczytać na dwa sposoby: metodą getAttribute("src") albo bezpośrednio przez właściwość element.src. Właściwość src odzwierciedla atrybut src ze znacznika <img>. Dla obrazka wskazanego zwykłą nazwą pliku - tak jak w tym ćwiczeniu - oba zapisy dają ten sam efekt.

img id="photo" src="image-b.svg" picture.getAttribute("src") picture.src "image-b.svg"
MDN, Web/API/HTMLImageElement/src: „The src property of the HTMLImageElement interface specifies the image to display in the <img> element. It reflects the <img> element's src content attribute.” - „Właściwość src interfejsu HTMLImageElement określa obrazek do wyświetlenia w elemencie <img>. Odzwierciedla ona atrybut treściowy src elementu <img>.” (tłum. własne)
Część 4 · Zmieniamy klasę: setAttribute("class", ...)

setAttribute("class", ...): zmiana etykiety elementu

Atrybut class to etykieta na elemencie - jedna nazwa albo kilka, po których CSS rozpoznaje, jak element ma wyglądać. setAttribute("class", "highlight") podmienia całą etykietę na nową (nie dokleja jej do starej).

img id="photo" class="" picture.setAttribute( "class", "highlight") img id="photo" class="highlight"

Uzupełnienie: wygodniejszym sposobem dodania jednej klasy bez nadpisania pozostałych jest classList (np. classList.add("highlight")). Ta właściwość zawiera listę klas elementu i pozwala dodawać albo usuwać pojedyncze nazwy.

Ciekawostka z MDN: właściwość, przez którą zmieniacie klasę elementu w JavaScript, nie nazywa się class, tylko className. Słowo class jest zastrzeżone w wielu językach programowania używanych do pracy z DOM, więc nie mogło zostać nazwą właściwości - stąd className.

MDN, Web/API/Element/setAttribute (slajd 4) · MDN, Web/API/Element/classList: „The read-only classList property of the Element interface contains a live DOMTokenList collection representing the class attribute of the element.” - „Właściwość classList (tylko do odczytu) interfejsu Element zawiera żywą kolekcję DOMTokenList reprezentującą atrybut class elementu.” (tłum. własne)
Egzamin EE.09

Tak pytają na egzaminie

1. Dany jest fragment kodu:

<img id="image" src="kol1.jpg">
<button id="button">Przycisk</button>
<script>
document.getElementById("image").src = "kol2.jpg";
</script>

Po wykonaniu fragmentu kodu HTML i JavaScript na stronie będzie wyświetlony obraz z pliku

  1. kol2.jpg
  2. kol1.jpg
  3. kol1.jpg, który może być zmieniony na kol2.jpg po wciśnięciu przycisku.
  4. kol2.jpg, który może być zmieniony na kol1.jpg po wciśnięciu przycisku.

2.

W języku JavaScript, aby zmienić wartość atrybutu znacznika HTML, po uzyskaniu obiektu za pomocą metody getElementById należy skorzystać z

  1. pola innerHTML.
  2. metody getAttribute.
  3. metody setAttribute.
  4. pola attribute i podać nazwę atrybutu.
CKE, EE.09, styczeń 2023, zadanie 38 · CKE, E.14, czerwiec 2017, zadanie 37
Ćwiczenie przy komputerze · 20 minut

Ćwiczenie: podmieniamy obrazek po kliknięciu

  1. Przygotuj dwa różne obrazki i nazwij je image-a.svg oraz image-b.svg - zapisz je w tym samym folderze co page.html.
  2. W page.html dodaj obrazek <img id="photo" src="image-a.svg"> i przycisk <button onclick="swapImage()">Zamień obrazek</button>.
  3. W script.js napisz funkcję swapImage() - pobiera element po id="photo" i ustawia jego atrybut src na "image-b.svg" przez setAttribute.
  4. Sprawdź w przeglądarce: otwórz page.html, kliknij przycisk, sprawdź, że obrazek A zmienia się na obrazek B.
Na koniec

Sprawdź się

  1. Co zwraca getAttribute("src"), jeśli element nie ma atrybutu src?
  2. Co robi setAttribute, gdy podany atrybut już istnieje na elemencie - dodaje kolejny czy zmienia wartość?
  3. Czym różni się setAttribute("class", ...) od classList.add(...)?

To tyle na dziś - kolejny temat: dodajemy nowy element na stronę.

Poza szkołą

A jak to wygląda w produkcji?

Na lekcjiW produkcjiStatus
setAttribute("class", ...) podmienia całą etykietęclassList.add/remove/toggle zmienia pojedynczą klasę bez nadpisania pozostałychzastępowane
getAttribute("src") / element.src osobno w każdym miejscu koduFrameworki (React, Vue) wiążą atrybut src ze zmienną stanu - zmiana zmiennej sama podmienia obrazekrozszerzane
Dwa gotowe pliki graficzne wskazane w kodzieAdres obrazka często budowany dynamicznie (np. z odpowiedzi serwera albo z parametru URL)rozszerzane
Definicje setAttribute/getAttribute/classList - slajdy 3-6 (MDN)