Javascript: DOM, eseménykezelés

JavaScript Web

A HTML DOM (Document Object Model) egy programozási interfész, amelyet weboldalak felépítésének és tartalmának reprezentálására használnak. Lehetővé teszi a webfejlesztők számára, hogy dinamikusan manipulálják és módosítsák a weboldal tartalmát és kinézetét. A HTML DOM az oldal elemeit fastruktúrába szervezi, amelyet a weboldal kódja alapján hoz létre. Minden HTML elem, például fejléc, szöveg, képek, űrlapok, hivatkozások stb., a DOM-ban egy objektumként jelenik meg. Ezeket az objektumokat JavaScript segítségével könnyen elérhetjük és manipulálhatjuk. Például változtathatjuk az elemek tartalmát, stílusát, hozzáadhatunk vagy eltávolíthatunk elemeket, kezelhetjük eseményeket stb.

Nézzük meg hogyan lehet JS függvényekkel kezelni a html objektumokat. Hogyan azonosíthatóak a html elemek?

getElementById: Ez a DOM módszer az elemek egyedi azonosítójára támaszkodik.

getElementsByClassName: Ezzel a módszerrel az elemeket egy adott osztály neve alapján lehet megtalálni. A html oldalon az összes olyan elem, amely ugyanazon osztályhoz tartozik, html collection-t ad vissza. A html collection indexelhető, és for ciklussal bejárható.

getElementsByTagName: Ezzel a módszerrel az elemeket HTML címkéjük (például <div>,<p>) alapján találja meg. Szintén html collection, tehát indexelhető, for vagy for..of ciklussal bejárható.

querySelector és querySelectorAll: Ezek a módszerek lehetővé teszik CSS szelektorok használatát az elemek keresésére. A querySelector az első talált elemet adja vissza, míg a querySelectorAll az összes találatot NodeList-ként adja vissza. A querySelectorAll által visszaadott nodelist indexelhető, bejárható for, for..of és foreach ciklussal.

Meg kell még említeni az Array.from() függvényt is, ami a html collectiont vagy a node listet tömbbé tudja alakítani. Ha már tömb, akkor az összes tömb művelet elvégezhető rajtuk.

HTML elemek módosítása

Tartalom módosítása:

Az elem tartalmának módosításához az adott elem innerHTML vagy textContent tulajdonságát módosíthatjuk:

var elem = document.getElementById("myElementId");
elem.innerHTML = "Új tartalom"; // HTML-t is tartalmazhat
// vagy
elem.textContent = "Új szöveg tartalom";

Attribútumok módosítása:

Az elem attribútumainak módosításához a setAttribute és getAttribute metódusokat használhatjuk:

var link = document.getElementById("myLink");
link.setAttribute("href", "új-link-cím");
var href = link.getAttribute("href");

Stílus módosítása:

Az elemek stílusát a style tulajdonságon keresztül módosíthatjuk. Ebben az esetben a CSS tulajdonságokat és értékeiket a JavaScript objektumként kezeljük.

var elem = document.getElementById("myElementId");
elem.style.color = "red";
elem.style.backgroundColor = "yellow";

Elemek hozzáadása és eltávolítása:

Új elemeket hozzáadhatunk az oldalhoz, vagy meglévő elemeket eltávolíthatunk. Például a createElement, appendChild és removeChild metódusok használhatók. A createElement létrehozza az elemet, ennek még célszerű tartalmat is adni (innerText, innerHTML, textContent). Utána az appendChild segítségével hozzá tudjuk adni a szükő elemhez. A removeChild segítségével el tudunk távolítani egy elemet. Lehetőség van még elemek cseréjére is a replaceChild segítségével.

Nézzünk egy példát ezek használatára! (createElement, appendChild , removeChild , replaceChild)

Eseménykezelő hozzáadása:

Az elemekhez eseménykezelők hozzáadásával reagálhatunk a felhasználói interakciókra.

var button = document.getElementById("myButton");
button.addEventListener("click", function() {
    alert("Gombra kattintva!");
});


Példa:

Készíts JS programot! Az ‘elso’ nevű függvény hozzon létre egy 10 elemű tömböt, random 1-50 közötti számmal! A számokat írja ki egy div-be! A ‘masodik’ nevű függvény számolja ki minden tömbelemnek a dupláját, és írja ki egy másik div-be! Ez a függvény akkor fusson le, ha az eslő div-en duplán kattintunk!
Formázd meg a 2db divet tetszőlegesen! A 2. div csak akkor jelenjen meg, amikor az elsőn duplán kattintunk!

Készíts űrlapot, ami kiszámolja egy szám négyzetét onfocusout eseményre!
Ha írunk a szövegbeviteli mezőbe (onfocus), legyen az input mező háttere zöld! Az eredményt egy div-be írja ki a program.

Készíts egy divet, és animáld! Használd az animationstart, animationiteration, animationend eseményeket! Az animáció indulásánál írasd ki az ‘animáció elindult!’ szöveget! A végén az ‘Animáció befejeződött!’ szöveget!

HTML elemek azonosítása – Összefoglaló táblázat

Függvény / tulajdonságMire való?Visszatérési típusPélda
getElementById(id)Egyetlen elem azonosító (id) alapjánElement vagy nulldocument.getElementById("doboz")
getElementsByTagName(tag)Minden elem, adott HTML címkével (pl. div, p)HTMLCollectiondocument.getElementsByTagName("p")
getElementsByClassName(cls)Minden elem adott osztálynévvelHTMLCollectiondocument.getElementsByClassName("aktiv")
querySelector(selector)Első elem, ami illik a CSS szelektorraElement vagy nulldocument.querySelector(".menu li.active")
querySelectorAll(selector)Minden elem, ami illik a CSS szelektorraNodeListdocument.querySelectorAll("ul > li")

A getElementsByTagName és getElementsByClassName esetén automatikusan frissül a gyűjtemény. A többinél újra le kell kérni a DOM-ot, ha van bármi változás.

DOM Navigáció – Összefoglaló

Metódus / TulajdonságMire való?TípusPélda
element.closest(selector)Megkeresi a legközelebbi szülőt vagy saját magát, ami illik a szelektorra.Element vagy nullelem.closest(".doboz")
element.matches(selector)Megnézi, hogy az elem illeszkedik-e a szelektorra.booleanelem.matches(".kiemelt")
element.childrenAz elem közvetlen gyerekeinek listája. Csak elemek (nincs szöveg/címke).HTMLCollectionelem.children[0]
element.parentElementAz elem közvetlen szülője (csak ha az is egy Element).Element vagy nullelem.parentElement
element.nextElementSiblingA következő testvér elem (szintén csak elem, nem szöveg).Element vagy nullelem.nextElementSibling
element.previousElementSiblingAz előző testvér elem.Element vagy nullelem.previousElementSibling

element.firstElementChildAz első gyerek elem.Element vagy nullelem.children[0]-hoz hasonló
element.lastElementChildAz utolsó gyerek elem.Element vagy null
element.childNodesAz összes gyerek node (szöveg, komment, elem is).NodeListHa kell szöveg/címke is
element.parentNodeUgyanaz mint parentElement, de Node típust is visszaadhat.Node vagy nullRitkábban használt
element.previousSibling / nextSiblingElőző/következő minden típusú node (nem csak element).NodeTartalmazhat szöveget, kommentet stb.