JavaScript i DOM - tworzenie, usuwanie i pozyskiwanie informacji z elementów
Opublikowano sob 02 maja 2020 w javascript • 3 min read
DOMContentLoaded
Na początek warto pamiętać o wydarzeniu DOMContentLoaded
- nasłuchuje przeładowania przeglądarki -> pozwala na wywołanie funkcji zmieniającej elementy DOM w momencie załadowania całości drzewa DOM (jest to istotne w momencie gdy plik zawierający skrypt js jest podlinkowany w
Przykładowe zastosowanie "zamknięcie" zmian w bloku/funkcji -> w momencie przeładowania przeglądarki (załadowania DOM) dodaj klasę 'd-none' do listy klas elementu input
document.addEventListener('DOMContentLoaded', function () {
input.classList.add('d-none');
});
Zamiast ("gołej" opcji, która nie daje gwarancji powodzenia w momencie kiedy js jest podlinkowany na początku):
input.classList.add('d-none');
Tworzenie elementów DOM
.createElement()
- stwórz element
const li = document.createElement('li')
li.innerText = `To jest tekst dodanego elementu`
.cloneNode(true)
lub .cloneNode(false)
- klonowanie elementu true = deep /false != deep
-> tzw głębokie klonowanie zakłada tworzenie takiej samej kopii wraz z dziećmi
const div2 = div1.cloneNode(true)
Klonowanie pozwala na replikację elementu i może być przydatne w sytuacji, w której chcemy stworzyć element taki sam do elementu istniejącego a następnie go zmienić. Element wyjściowy (wzór) może być stworzony w HTML i może mieć ustawiony display = none lub może powstać na podstawie funkcji tworzącej
.appendChild()
- dodanie elementu jako dziecka dziecka
li.appendChild(document.createTextNode('Hello World')) // dodanie węzła tekstowego zamkniętego pomiędzy tagami *li*
e.target.nextElementSibling.appendChild(li) // dodanie dziecka li następnego rodzeństwa elementu na którym wykonał się dany event/wydarzenie
Przykładowy łańcuch zdarzeń
const link = document.createElement('a')
link.className = 'nav-link'
link.innerHTML = '<i class=fa fa-remove></i>'
li.appendChild(link)
Dodanie wygenerowanego elementu do innego
document.querySelector('ul').appendChild(li)
.insertBefore(nowyElement, dziecko)
- wstawienie nowego elementu przed wybranym dzieckiem
::: Jeśli argumentem w powyższych metodach stanie się element już istniejący zostanie on wycięty (z całym dobrobytem/dziećmi) i wklejony w nowe miejsce :::
Przykładowo (appendChild - wkleja z nowe miejsca jak i usuwa w poprzednim // dochodzi do kopiowania przez wartość ale nie referencje - zatem powstaje nowy obiekt):
function move() {
let elemParent = this.parentElement;
if (elemParent.id === 'list1') {
document.getElementById('list2').appendChild(this);
} else {
document.getElementById('list1').appendChild(this);
}
};
Usuwanie i wymiana elementów
Zmiana elementu odbywa się na JEGO rodzicu
.replaceChild(nowyElement, staryElementDziecko)
- wymiana elementu
.replace(nowyElement, dziecko)
- zamiana wybranego dziecka na inny element
Przykładowy ciąg zdarzeń
const newTitle = document.createElement('h2'); //tworzymy element
newTitle.id = 'title-id' // nadajemu mu id
newTitle.appendChild(document.createTextNode('Nowy tytuł')) // dodajemy do niego tekst
const oldTitle = document.getElementById('title-id'); // "złapanie" elementu podlegającego wymianie
const parentDiv = document.querySelector('div.nav-bar') // "złapanie rodzica"
parentDiv.replaceChild(newTitle,oldTitle)
.remove()
- usuwa podany element
.removeChild()
- usuwa dziecko podanego elementu
const listItems = document.querySelectorAll('li')
listItems[0].remove() // usuwa pierwszy element
list = document.querySelectorAll('ul')
list.removeChild(listItems[0]) // usuwa pierwsze dziecko mające tag *li*
Usuwanie elementu poprzez odwołanie się do rodzica
const deleteDroid = document.querySelector('#c3po')
deleteDroid.parentElement.removeChild(deleteDroid)
Zmiana klasy i atrybutu
Dodawanie atrybutów
element.setAttribute('attribute', 'właściwość')
.setAttribute(atrybut, jego właściwość)
- pozwala na zdefiniowanego atrybutu
link.getAttribute('href') //złap atrybutem
link.setAttribute('href','http://google.com') // dodaj atrybut i jego właściwość
link.hassAttribute('title') // zwraca true albo false jeśli taki posiada lub nie
.removeAttribute()
- usuwa atrybut
link.removeAttribute('title')
.className
- dodawanie klasy
element.className = 'list-item' // można również dodać id w podobny sposób
.add()
- dodaje klasę do listy klas
.remove()
- usuwa klasę
const link = document.querySelector('li:first-child').children[0]
let classLink = link.className //zwraca klasy w postaci stringu
let listOfClasses = link.classList // zwracam listę klas w postaci DOMTokenList - zbliżone do tablicy - posiada indeksy
link.classList.add('second-class') // dodaje klasę
link.classList.remove('second-class') // usuwa klasę
Wydobywanie informacji
.tagName
- zwraca informację o tagu/etykiecie w formie stringa (wszystkie litery duże)
element.tagName
document.getElementById("IdOfLink").tagName;
>> "A"
.id
- zwraca id danego elementu
document.querySelectorAll("a")[10].id // id 11. elementu będący linkiem
w podobny sposób można uzyskać .innerHTML
.innerText
Z formularza (form i input)
form
.action
- zwraca URL do którego prowadzi wysłany formularz
.method
- metoda którą wysyłany jest formularz GET lub POST
.elements
- zwraca elementy formularza
.elements.name.value
- zwraca zawartość elementu będącego dziecka noszącego nazwę name
form.elements.email.value // zwraca wartość elementu który zawiera (name =
"email")
Formularz posiada specjalne zdarzenie
submit
- wywoływane przy wysłaniu formularza
reset
- wywoływane przy zresetowaniu formularza
input
.value
- zwraca właściwość inputu/ to co zostało w niego wpisane/podane
.type
- zwraca typ elementu input/pozwala również na jego ustawienie
.disabled
- zwraca boolean, jeśli false to znaczy, że jest możliwe wprowadzenie danych jeśli ustawimy na true to wówczas będzie on nieaktywny
input.disabled = "true"
.checked
- zwraca wartość logiczną true jeśli input jest typu checkbox i został on zaznaczony
.selected
zwraca wartość logiczną true jeśli input jest typu select (rozwijana lista) i został on wybrany
Stosowanie funkcji oraz iteracje
W kontekście stosowanie iteracji poprzez elementy DOM należy zwrócić uwagę na dwa kluczowe aspekty
1) czy zbiór, na którym planujemy iterację pozwala na to no NodeList posiada metodę forEach (a HTML-collection już jej nie posiada) czy wymaga konwersji np. poprzez zastosowanie metody tablic np Array.from(HTML-collection)
lub spread operatora np. const arr = [...HTML-collection]
2) czy funkcja, z którą będziemy pracować pozwala na skuteczne stosowanie słowa kluczowego this
czy wymaga pracy z event.target
. Funkcja strzałkowa albo inna deklarowana przez wyrażenie funkcyjne sprawi, że this
będzie obiektem window
podczas gdy deklaracja poprzedzona słowem kluczowym function
gwarantuje, że this
jest elementem, na którym dokonuje się event.
Ćwiczenia
Źródła:
https://developer.mozilla.org/en-US/do