JavaScript DOM opetusohjelma esimerkin kanssa
⚡ Älykäs yhteenveto
JavaSkriptien DOM ja tapahtumat antavat skripteille täyden hallinnan verkkosivuun, jolloin koodi voi lukea, muuttaa, lisätä tai poistaa mitä tahansa selaimen renderöimiä elementtejä ja reagoida välittömästi aina, kun kävijä napsauttaa, kirjoittaa tai vierittää.

Mitä DOM sisältää JavaKäsikirjoitus?
JavaSkripti voi käyttää kaikkia verkkosivun elementtejä Document Object Model (DOM) -mallin avulla. Itse asiassa verkkoselain luo verkkosivusta DOM-mallin, kun sivu ladataan. DOM-malli luodaan seuraavanlaisena objektipuuna:
Jokainen sivun HTML-elementti muuttuu solmuksi tämän puun sisällä. Selaimet ryhmittelevät DOM-solmut muutamiin ydintyyppeihin: elementtisolmut edustavat tageja, kuten <p> or <div>, tekstisolmut säilyttävät tunnisteen sisällä olevia näkyviä sanoja, attribuuttisolmut säilyttävät arvoja, kuten id or classja kommenttisolmut säilyttävät <!-- --> merkintätapa. Ylin solmu on aina document objekti, ja kaikki muut elementit ovat sen jälkeläisiä.
DOM:n avulla JavaKäsikirjoitus voi suorittaa useita tehtäviä. Se voi luoda uusia elementtejä ja attribuutteja, muuttaa olemassa olevia elementtejä ja attribuutteja ja jopa poistaa olemassa olevia elementtejä ja attribuutteja. JavaSkripti voi myös reagoida olemassa oleviin tapahtumiin ja luoda uusia tapahtumia sivulle. Alla olevat osiot käyvät läpi elementtien valitsemisen, muokkaamisen ja tapahtumankäsittelijöiden kytkemisen käytännönläheisten, suoritettavien esimerkkien avulla.
On hyvä muistaa, että DOM ei ole sama asia kuin HTML-lähdekooditiedosto. Selaimen lataama HTML on staattista tekstiä, mutta tekstistä rakentama DOM on elävä, dynaaminen objektimalli. Kaikki muutokset JavaDOM:iin tehty skripti näkyy näytöllä välittömästi ilman, että alkuperäiseen HTML-tiedostoon kosketaan.
DOM-elementtien valitseminen JavaKäsikirjoitus
Ennen JavaSkripti voi muuttaa mitä tahansa sivulla, mutta sen on ensin valittava kohdesolmu. DOM tarjoaa useita valintametodeja, joista jokainen sopii eri tilanteisiin:
- getElementById(): palauttaa yhden elementin, joka vastaa annettua funktiota
idmäärite. - getElementsByClassName(): palauttaa reaaliaikaisen HTMLCollection-kokoelman jokaisesta elementistä, joka sisältää annetun luokan.
- getElementsByTagName(): palauttaa reaaliaikaisen HTMLCollection-kokoelman jokaisesta elementistä, jolla on annettu tagin nimi, kuten
porli. - kyselynvalitsin(): palauttaa ensimmäisen elementin, joka vastaa mitä tahansa CSS-valitsinta.
- kyselyValitsijaKaikki(): palauttaa staattisen NodeList-listin jokaisesta CSS-valitsinta vastaavasta elementistä.
Alla olevassa taulukossa vertaillaan neljää yleisimmin käytettyä valintamenetelmää, jotta voit valita työhön sopivan.
| Menetelmä | Palautukset | Paras käytetty Milloin |
|---|---|---|
| getElementById | Yksi elementti | Tiedät kohteen tarkan ja yksilöllisen tunnuksen. |
| getElementsByClassName | Live HTML-kokoelma | Tarvitset jokaisen elementin, jolla on yksi luokkanimi. |
| querySelector | Yksittäinen elementti (ensimmäinen osuma) | Haluat käyttää mitä tahansa CSS-valitsinta, etkä vain id:tä tai luokkaa. |
| querySelectorAll | Staattinen solmuluettelo | Sinun täytyy käydä läpi jokainen osuma forEach-metodilla. |
querySelector ja querySelectorAll hyväksyvät minkä tahansa kelvollisen CSS-valitsimen, mikä tekee niistä joustavimman vaihtoehdon moderniin koodiin. Kokeile alla olevaa koodinpätkää sivulla, joka sisältää elementin, jossa on id="title" ja useita elementtejä, joissa on class="item":
const heading = document.getElementById("title"); const itemsByClass = document.getElementsByClassName("item"); const firstItem = document.querySelector(".item"); const allItems = document.querySelectorAll(".item"); console.log(heading.textContent, itemsByClass.length, allItems.length);
getElementById ja getElementsByClassName pysyvät nopeampina yksinkertaisissa hauissa, kun taas querySelector ja querySelectorAll ovat parempia aina, kun valintalogiikka tarvitsee täyden CSS-syntaksin tehoa, kuten attribuutti- tai jälkeläisvalitsimia.
DOM-elementtien muokkaaminen, luominen ja poistaminen
Kun elementti on valittu, JavaSkripti voi lukea tai kirjoittaa uudelleen sisällönsä, attribuuttinsa ja jopa olemassaolonsa puussa. DOM:n avulla JavaSkripti voi luoda uusia elementtejä ja attribuutteja, muuttaa olemassa olevia elementtejä ja attribuutteja sekä poistaa olemassa olevia elementtejä ja attribuutteja kokonaan.
Muuta sisältöä getElementById:n ja innerHTML:n avulla
- getElementById: Käyttääksesi elementtejä ja attribuutteja, joiden tunnus on asetettu.
- innerHTML: Elementin sisällön käyttäminen.
Kokeile tätä esimerkkiä itse:
<html> <head> <title>DOM!!!</title> </head> <body> <h1 id="one">Welcome</h1> <p>This is the welcome message.</p> <h2>Technology</h2> <p>This is the technology section.</p> <script type="text/javascript"> var text = document.getElementById("one").innerHTML; alert("The first heading is " + text); </script> </body> </html>
Hälytysikkuna vahvistaa, että getElementById paikansi otsikon ja innerHTML palautti sen sisällä olevan tekstin.
Lue jokainen kappale getElementsByTagName-funktiolla
getElementsByTagName: Elementtien ja attribuuttien käyttäminen tagin nimen avulla. Tämä menetelmä palauttaa an ryhmä kaikista kohteista, joilla on sama tunnistenimi.
Kokeile tätä esimerkkiä itse:
<html> <head> <title>DOM!!!</title> </head> <body> <h1>Welcome</h1> <p>This is the welcome message.</p> <h2>Technology</h2> <p id="second">This is the technology section.</p> <script type="text/javascript"> var paragraphs = document.getElementsByTagName("p"); alert("Content in the second paragraph is " + paragraphs[1].innerHTML); document.getElementById("second").innerHTML = "The orginal message is changed."; </script> </body> </html>
Koska getElementsByTagName palauttaa live-kokoelman, paragraphs[1] viittaa dokumentin toiseen kappaleeseen, ja innerHTML:n päivittäminen korvaa sen tekstin välittömästi näytöllä.
Luo ja poista elementtejä createElement- ja removeChild-funktioilla
Sivulla jo olevien elementtien muuttamisen lisäksi DOM antaa sinun lisätä aivan uusia elementtejä tai poistaa olemassa olevia:
- luoElementti(): rakentaa uuden elementtisolmun muistiin.
- appendChild(): liittää solmun pääelementin viimeiseksi lapseksi.
- setAttribute(): lisää tai päivittää ominaisuuden, kuten
classorhref, elementillä. - poistaLapsi(): poistaa määritetyn lapsisolmun sen vanhemmasta.
Alla oleva esimerkki luo uuden listakohteen, antaa sille tekstin ja luokan, liittää sen olemassa olevaan listaan ja poistaa sitten aivan ensimmäisen kohteen samasta listasta:
const list = document.getElementById("myList"); const newItem = document.createElement("li"); newItem.textContent = "Freshly added item"; newItem.setAttribute("class", "highlight"); list.appendChild(newItem); list.removeChild(list.firstElementChild);
Pelkkä createElement() ei näytä mitään, koska solmu sijaitsee edelleen vain muistissa. Se ilmestyy vain, kun appendChild() tai vastaava metodi, kuten prepend(), liittää sen jonnekin näkyvän puun sisälle. Nykyaikaiset selaimet tukevat myös lyhyempää node.remove()-metodia, joka poistaa elementin suoraan ilman viittausta sen vanhempaan, toisin kuin vanhempi parent.removeChild(node)-syntaksi.
Tapahtumien käsittely JavaKäsikirjoitus
Tapahtuma on mikä tahansa toiminto, jonka selain voi havaita, kuten klikkaus, näppäimen painallus tai sivun lataus. Voit lisätä tapahtumankäsittelijän tiettyyn elementtiin kahdella päätavalla.
Liitä käsittelijä onclick- tai addEventListener-funktiolla
Ensimmäinen, vanhempi lähestymistapa määrittää funktion suoraan elementin on-event-ominaisuudelle:
document.getElementById(id).onclick=function()
{
lines of code to be executed
}
TAI käyttämällä modernia ja joustavampaa addEventListener()-metodia:
document.getElementById(id).addEventListener("click", functionname)
addEventListener()-funktiota suositaan yleensä, koska sen avulla voit liittää useamman kuin yhden käsittelijän samaan tapahtumaan samassa elementissä, ja se hyväksyy valinnaisen kolmannen argumentin, joka ohjaa tallentamista, mitä käsitellään myöhemmin tässä osiossa. Se toimii myös yhdessä removeEventListener()-funktion kanssa, joka irrottaa käsittelijän, kun sitä ei enää tarvita, mitä onclick-ominaisuus ei voi tehdä yksinään.
HTML tukee myös kolmatta tyyliä: suoraan tagiin kirjoitettua rivikohtaista käsittelijää, kuten <button onclick="clicked()">Click Me</button>Sisäänrakennetut käsittelijät sekoittavat merkintöjä logiikkaan ja niistä tulee nopeasti vaikeasti ylläpidettäviä, joten useimmat JavaSkriptikehittäjät varaavat ne nopeisiin demoihin ja luottavat addEventListener()-funktioon todellisissa sovelluksissa.
Kokeile: esimerkki täydellisestä klikkaustapahtumasta
Kokeile tätä esimerkkiä itse:
<html> <head> <title>DOM!!!</title> </head> <body> <input type="button" id="btnClick" value="Click Me!!" /> <script type="text/javascript"> document.getElementById("btnClick").addEventListener("click", clicked); function clicked() { alert("You clicked me!!!"); } </script> </body> </html>
Painikkeen napsauttaminen laukaisee clicked()-funktion, joka laukaisee JavaSkriptihälytysikkuna, joka vahvistaa tapahtumankäsittelijän suorittamisen onnistuneesti.
Tapahtumaobjekti
Jokainen tapahtumankäsittelijä saa automaattisesti ensimmäisenä argumenttinaan tapahtumaobjektin. Tämä objekti sisältää hyödyllisiä tietoja tapahtuneesta, mukaan lukien event.target (tarkan elementin, josta toiminto sai alkunsa), event.type (tapahtuman nimi, kuten ”click”) ja metodit, kuten event.preventDefault(), joka pysäyttää selaimen oletustoiminnan, kuten linkin seuraamisen tai lomakkeen lähettämisen.
document.getElementById("btnClick").addEventListener("click", function(event) { console.log("Clicked element: " + event.target.id); });
Tapahtumaobjektin täydentävät kaksi muuta ominaisuutta: event.currentTarget viittaa aina elementtiin, johon kuuntelija on liitetty, vaikka event.target raportoisi sisäkkäisen lapsen, ja event.stopPropagation() pysäyttää tapahtuman ennen kuin se jatkaa kuplimista tai kaappaamista. Yhdessä preventDefault()-funktion kanssa nämä työkalut antavat käsittelijälle tarkan hallinnan siitä, mitä seuraavaksi tapahtuu.
Tapahtuma Bubblminen, talteenotto ja delegointi
Kun tapahtuma käynnistyy sisäkkäisessä elementissä, se ei pysähdy siihen. kuplivaa vaiheessa tapahtuma kulkee ylöspäin kohdeelementistä jokaisen esi-isän kautta aina dokumenttiin asti. syömällä vaihe, joka suoritetaan ensin ja on valinnainen, tapahtuma sen sijaan kulkee alaspäin dokumentista kohteeseen ennen kuplimisen alkamista. {capture: true} kolmantena argumenttina, jota addEventListener() käyttää kuunnellakseen sieppausvaiheen aikana.
Tapahtuman delegointi hyödyntää kuplimista: sen sijaan, että jokaiseen lapsielementtiin liitettäisiin erillinen kuuntelija, liitetään yksi kuuntelija jaettuun pääelementtiin ja event.target-tiedostoa tarkastellaan sen määrittämiseksi, mikä lapsielementti laukaisi sen. Tämä käyttää vähemmän muistia ja peittää automaattisesti sivulle myöhemmin lisätyt elementit.
const list = document.getElementById("myList"); list.addEventListener("click", function(event) { if (event.target.tagName === "LI") { alert("You clicked " + event.target.textContent); } });
Delegointi, yhdessä kuplivien ja tallentamisen kanssa, antaa sinulle tarkan hallinnan siitä, miten DOM ja tapahtumat ... -kohdassa ... JavaSkripti reagoi sivun muuttuessa vuorovaikutteisemmaksi.

