DOM-navigasjonsegenskaper er gode når elementene er nær hverandre. Hva om de ikke er det? Hvordan får du et vilkårlig element på siden?
Det er flere søkemetoder for det.
document.getElementById eller bare id
Hvis et element har id
attributt, vi kan få elementet ved hjelp av metoden document.getElementById(id)
, uansett hvor det er.
For eksempel :
Det er også en global variabel kalt id
som refererer til elementet:
… Det er med mindre vi erklærer en JavaScript-variabel med samme navn, så har det forrang:
Denne oppførselen er beskrevet i spesifikasjonen, så det er litt standard. Men det støttes hovedsakelig for kompatibilitet.
Nettleseren prøver å hjelpe oss ved å blande navneplasser til JS og DOM. Det er greit for enkle skript, innfelt i HTML, men generelt sett er det ikke noe bra. Det kan være navnekonflikter. Når man leser JS-kode og ikke har HTML i visningen, er det ikke åpenbart hvor variabelen kommer fra.
Her i veiledningen bruker vi id
å referere direkte til et element for kortfattethet, når det er åpenbart hvor elementet kommer fra.
I det virkelige liv er document.getElementById
den foretrukne metoden.
id
må være unik id
må være unik. Det kan bare være ett element i dokumentet med den gitte id
.
Hvis det er flere elementer med samme id
, så er oppførselen til metoder som bruker den uforutsigbar, f.eks document.getElementById
kan returnere noen av slike elementer tilfeldig. Så hold deg til regelen og hold id
unik.
document.getElementById
, ikke anyElem.getElementById
Metoden getElementById
kan bare kalles på document
objekt. Det ser etter den gitte id
i hele dokumentet.
querySelectorAll
Langt, mest allsidig metode, elem.querySelectorAll(css)
returnerer alle elementene i elem
som samsvarer med den gitte CSS-velgeren.
Her ser vi etter alle <li>
elementer som er siste barn:
Denne metoden er virkelig kraftig, fordi en hvilken som helst CSS-velger kan brukes.
Pseudoklasser i CSS-velgeren som :hover
og :active
støttes. For eksempel vil document.querySelectorAll(":hover")
returnere samlingen med elementer som pekeren er over nå (i nestende rekkefølge: fra den ytterste <html>
til den mest nestet).
querySelector
Anropet til elem.querySelector(css)
returnerer det første elementet for den gitte CSS selector.
Med andre ord, resultatet er det samme som elem.querySelectorAll(css)
, men sistnevnte leter etter alle elementene og velger en, mens elem.querySelector
bare ser etter en. Så det er raskere og også kortere å skrive.
samsvarer
Tidligere metoder søkte i DOM.
Elem.matches (css) ser ikke etter noe , det sjekker bare om elem
samsvarer med den gitte CSS-velgeren. Den returnerer true
eller false
.
Metoden er nyttig når vi itererer over elementer (som i en array eller noe) og prøver å filtrere ut de som interesserer oss.
For eksempel:
nærmest
Forfedre til et element er: foreldre, foreldre til foreldre, foreldre og så videre. Forfedrene sammen danner foreldrekjeden fra elementet til toppen.
Metoden elem.closest(css)
ser etter nærmeste forfader som samsvarer med CSS-velgeren. elem
i seg selv er også inkludert i søket.
Med andre ord, metoden closest
går opp fra element og sjekker hver av foreldrene. Hvis den samsvarer med velgeren, stopper søket og forfedren returneres.
For eksempel:
getElementsBy *
Det er også andre metoder å se på for noder etter en tagg, klasse osv.
I dag er de for det meste historie, da querySelector
er kraftigere og kortere å skrive.
Så her dekker vi dem hovedsakelig for fullstendighet, mens du fortsatt kan finne dem i de gamle skriptene.
-
elem.getElementsByTagName(tag)
ser etter elementer med det gitte tag og returnerer samlingen av dem.tag
-parameteren kan også være en stjerne"*"
for «eventuelle koder». -
elem.getElementsByClassName(className)
returnerer elementer som har den gitte CSS-klassen. -
document.getElementsByName(name)
returnerer elementer med det gittename
-attributtet, hele dokumentet. Svært sjelden brukt.
For eksempel:
La oss finne alle input
tagger inne i tabellen:
"s"
brev! Nybegynnerutviklere glemmer noen ganger bokstaven "s"
. Det vil si at de prøver å ringe getElementByTagName
i stedet for getElementsByTagName
.
"s"
bokstaven er fraværende i getElementById
, fordi den returnerer et enkelt element. Men getElementsByTagName
returnerer en samling elementer, så det er "s"
inni.
En annen utbredt nybegynnerfeil er å skrive:
Det vil ikke fungere, fordi det tar en samling innganger og tildeler verdien til den i stedet for til elementene i den.
Vi bør enten gjenta over samlingen eller få et element etter indeksen, og deretter tildele, slik:
Ser etter .article
-elementer:
Live samlinger
Alle metoder "getElementsBy*"
returnerer en live samling. Slike samlinger gjenspeiler alltid dokumentets nåværende tilstand og «automatisk oppdatering» når det endres.
I eksemplet nedenfor er det to skript.
- Den første oppretter en referanse til samlingen av
<div>
. Per nå er lengden1
. - De andre skriptene kjører etter at nettleseren møter en til
<div>
, så lengden er2
.
I kontrast , querySelectorAll
returnerer en statisk samling. Det er som et fast utvalg av elementer.
Hvis vi bruker den i stedet, så skriver begge skriptene ut 1
:
Nå kan vi lett se forskjellen. Den statiske samlingen økte ikke etter at en ny div
dukket opp i dokumentet.
Sammendrag
Det er 6 hovedmetoder for å søke etter noder i DOM:
Metode | Søk etter … | Kan kal Jeg på et element? | Live? |
querySelector |
CSS-velger | ✔ | – |
querySelectorAll |
CSS-velger | ✔ | – |
getElementById |
id |
– | – |
getElementsByName |
name |
– | ✔ |
getElementsByTagName |
-tag eller "*" |
✔ | ✔ |
getElementsByClassName |
klasse | ✔ | ✔ |
Langt mest brukt er querySelector
og querySelectorAll
, men getElement(s)By*
kan være sporadisk nyttig eller finnes i de gamle skriptene.
I tillegg til det:
- Det er
elem.matches(css)
for å sjekke omelem
samsvarer med den gitte CSS-velgeren. - Det er
elem.closest(css)
for å se etter nærmeste forfader som samsvarer den gitte CSS-velgeren. Selveelem
er også sjekket.
Og la oss nevne en metode til for å se etter forholdet mellom barn og foreldre, da det noen ganger er nyttig:
-
elemA.contains(elemB)
returnerer sant hviselemB
er inne ielemA
(en etterkommer avelemA
) eller nårelemA==elemB
.