DOM-navigointiominaisuudet ovat erinomaisia, kun elementit ovat lähellä toisiaan. Entä jos he eivät ole? Kuinka saada mielivaltainen sivun elementti?
Sille on muita hakumenetelmiä.
document.getElementById tai vain id
Jos elementillä on id
-määritteen avulla voimme saada elementin käyttämällä menetelmää document.getElementById(id)
riippumatta siitä, missä se on.
Esimerkiksi :
Lisäksi on olemassa globaali muuttuja, jonka nimi on id
ja joka viittaa elementtiin:
… Ellemme julista JavaScript-muuttujaa sama nimi, niin se on etusijalla:
Tätä toimintaa kuvataan eritelmä, joten se on eräänlainen standardi. Mutta sitä tuetaan pääasiassa yhteensopivuuden vuoksi.
Selain yrittää auttaa meitä sekoittamalla JS: n ja DOM: n nimiavaruudet. Se on hieno yksinkertaisille skripteille, jotka on upotettu HTML-muotoon, mutta se ei yleensä ole hyvä asia. Nimen ristiriitoja voi olla. Kun lukee JS-koodia eikä HTML-koodia ole näkyvissä, ei ole selvää, mistä muuttuja tulee.
Tässä opetusohjelmassa käytämme id
viitata suoraan elementtiin lyhyyden suhteen, kun on selvää, mistä elementti tulee.
Todellisessa elämässä document.getElementById
on suositeltava menetelmä.
id
on oltava yksilöllinen id
on oltava ainutlaatuisia. Annetussa id
-asiakirjassa voi olla vain yksi elementti.
Jos on olemassa useita elementtejä, joilla on sama id
, niin sitä käyttävien menetelmien käyttäytyminen on arvaamatonta, esim document.getElementById
voi palauttaa minkä tahansa tällaisista elementeistä satunnaisesti. Joten pidä kiinni säännöstä ja pidä id
ainutlaatuisena.
document.getElementById
, ei anyElem.getElementById
Menetelmää getElementById
voidaan kutsua vain osoitteessa document
-objekti. Se etsii annettuja id
koko asiakirjasta.
querySelectorAll
Ylivoimaisesti eniten monipuolinen menetelmä, elem.querySelectorAll(css)
palauttaa kaikki elem
-elementit, jotka vastaavat annettua CSS-valitsinta.
Täältä etsimme kaikkia <li>
elementit, jotka ovat viimeisiä lapsia:
Tämä menetelmä on todellakin tehokas, koska mitä tahansa CSS-valitsinta voidaan käyttää.
CSS-valitsimen näennäisluokat, kuten :hover
ja :active
ovat myös tuettu. Esimerkiksi document.querySelectorAll(":hover")
palauttaa kokoelman elementeillä, jotka osoitin on nyt ohi (pesimäjärjestyksessä: syrjäisimmistä <html>
sisäkkäin yksi).
querySelector
Kutsu elem.querySelector(css)
palauttaa annetun elementin ensimmäisen elementin valitsin.
Toisin sanoen tulos on sama kuin elem.querySelectorAll(css)
, mutta jälkimmäinen etsii kaikkia elementtejä ja valitsee yhden, kun taas elem.querySelector
etsii vain yhtä. Joten kirjoittaminen on nopeampaa ja myös lyhyempää.
vastaa
Aikaisemmat menetelmät etsivät DOM: ia.
Elem.matches (css) ei etsi mitään , se vain tarkistaa, vastaako elem
annettuja CSS-valitsimia. Se palauttaa true
tai false
.
Menetelmä on kätevä, kun toistamme elementtejä (kuten taulukko tai jotain) ja yrittää suodattaa meidät kiinnostavat.
Esimerkiksi:
lähin
Elementin esi-isät ovat: vanhempi, vanhempi, sen vanhempi ja niin edelleen. Esivanhemmat muodostavat yhdessä vanhempien ketjun elementistä ylöspäin.
Menetelmä elem.closest(css)
etsii lähintä CSS-valitsinta vastaavaa esi-isää. Itse elem
sisältyy myös hakuun.
Toisin sanoen menetelmä closest
nousee ja tarkistaa jokaisen vanhemman. Jos se vastaa valitsinta, haku pysähtyy ja esi-isä palautetaan.
Esimerkiksi:
getElementsBy *
On myös muita etsittäviä tapoja tunnisteen, luokan jne. solmuille.
Nykyään ne ovat enimmäkseen historiaa, koska querySelector
on tehokkaampi ja lyhyempi kirjoittaa.
Joten tässä käsitellään niitä lähinnä täydellisyyden vuoksi, mutta voit silti löytää ne vanhoista skripteistä.
-
elem.getElementsByTagName(tag)
etsii elementtejä annetulla ja palauttaa niiden kokoelman. Parametritag
voi olla myös tähti"*"
kaikille ”tageille”. -
elem.getElementsByClassName(className)
palauttaa elementit, joilla on annettu CSS-luokka. -
document.getElementsByName(name)
palauttaa elementit annettuname
-attribuutti, koko asiakirja. Hyvin harvoin käytetty.
Esimerkiksi:
Etsitään kaikki input
-tagit taulukon sisältä:
"s"
kirjain! Aloittelevat kehittäjät unohtavat joskus kirjaimen "s"
. Toisin sanoen he yrittävät soittaa getElementByTagName
getElementsByTagName
: n sijaan.
"s"
kirjain puuttuu getElementById
-kohdasta, koska se palauttaa yhden elementin. Mutta getElementsByTagName
palauttaa kokoelman elementtejä, joten sisällä on "s"
.
Toinen yleinen aloittelijavirhe on kirjoittaa:
Se ei toimi, koska se vie kokoelman syötteitä ja osoittaa arvon sille eikä sen sisällä oleville elementeille.
Meidän on joko iteroitava kokoelma tai haettava elementti sen hakemiston perusteella ja määritettävä sitten seuraavasti:
Etsitään elementtejä .article
:
Live-kokoelmat
Kaikki menetelmät "getElementsBy*"
palauttavat elävän kokoelman. Tällaiset kokoelmat heijastavat aina asiakirjan nykyistä tilaa ja ”automaattinen päivitys”, kun se muuttuu.
Alla olevassa esimerkissä on kaksi komentosarjaa.
- Ensimmäinen luo viitteen
<div>
-kokoelmaan. Sen pituus on toistaiseksi1
. - Toinen komentosarja suoritetaan, kun selain tapaa vielä yhden
<div>
, joten sen pituus on2
.
Sen sijaan , querySelectorAll
palauttaa staattisen kokoelman. Se on kuin kiinteä joukko elementtejä.
Jos käytämme sitä sen sijaan, molemmat komentosarjat tuottavat 1
:
Nyt voimme helposti nähdä eron. Staattinen kokoelma ei lisääntynyt, kun uusi div
esiintyi asiakirjassa.
Yhteenveto
DOM-solmujen etsimiselle on 6 päämenetelmää:
Menetelmä | Hakee … | Voi l elementissä? | Live? |
querySelector |
CSS-valitsin | ✔ | – |
querySelectorAll |
CSS-valitsin | ✔ | – |
getElementById |
id |
– | – |
getElementsByName |
name |
– | ✔ |
getElementsByTagName |
-tunniste tai "*" |
✔ | ✔ |
getElementsByClassName |
luokka | ✔ | ✔ |
Ylivoimaisesti eniten käytetyt ovat querySelector
ja querySelectorAll
, mutta getElement(s)By*
voi olla satunnaisesti hyödyllistä tai löytyy vanhoista skripteistä.
Sen lisäksi:
-
elem.matches(css)
tarkistaaksesi, vastaa annettuja CSS-valitsimia. -
elem.closest(css)
on etsimässä lähintä vastaavaa esi-isää annettu CSS-valitsin. Myös itseelem
tarkistetaan.
Mainitaan tässä vielä yksi tapa tarkistaa lapsen ja vanhemman suhde, koska se on joskus hyödyllistä:
-
elemA.contains(elemB)
palauttaa arvon true, joselemB
onelemA
(elemA
jälkeläinen) tai kunelemA==elemB
.