Căutarea: getElement *, querySelector *

Proprietățile de navigare DOM sunt excelente atunci când elementele sunt apropiate unele de altele. Dacă nu sunt? Cum se obține un element arbitrar al paginii?

Există metode de căutare suplimentare pentru asta.

document.getElementById sau doar id

Dacă un element are id, putem obține elementul folosind metoda document.getElementById(id), indiferent unde este.

De exemplu :

De asemenea, există o variabilă globală numită de id care face referire la elementul:

… Asta dacă nu declarăm o variabilă JavaScript cu același nume, apoi are prioritate:

Vă rugăm să nu utilizați variabile globale numite id pentru a accesa elementele

Acest comportament este descris în specificația, deci este un fel de standard. Dar este acceptat în principal pentru compatibilitate.

Browserul încearcă să ne ajute amestecând spații de nume JS și DOM. Este în regulă pentru scripturile simple, înclinate în HTML, dar în general nu este un lucru bun. Pot exista conflicte de denumire. De asemenea, atunci când cineva citește codul JS și nu are HTML în vizualizare, nu este evident de unde provine variabila.

Aici în tutorial folosim id pentru a face referire directă la un element pentru concizie, atunci când este evident de unde provine elementul.

În viața reală document.getElementById este metoda preferată.

id trebuie să fie unic

id trebuie să fie unic. Nu poate exista decât un singur element în document cu id.

Dacă există mai multe elemente cu același id, atunci comportamentul metodelor care îl utilizează este imprevizibil, de ex document.getElementById poate returna oricare dintre aceste elemente la întâmplare. Așadar, vă rugăm să respectați regula și să păstrați id unic.

Numai document.getElementById, nu anyElem.getElementById

Metoda getElementById poate fi apelată numai pe document. Se caută id dat în întregul document.

querySelectorAll

De departe, cel mai metodă versatilă, elem.querySelectorAll(css) returnează toate elementele din elem care se potrivesc cu selectorul CSS dat.

Aici căutăm toate <li> elemente care sunt ultimii copii:

Această metodă este într-adevăr puternică, deoarece poate fi utilizat orice selector CSS.

Poate folosi și pseudo-clase

Pseudo-clasele din selectorul CSS precum :hover și :active sunt, de asemenea, sprijinit. De exemplu, document.querySelectorAll(":hover") va returna colecția cu elementele pe care pointerul le-a trecut acum (în ordinea de cuibărire: de la <html> la cel mai extern imbricat).

querySelector

Apelul către elem.querySelector(css) returnează primul element pentru CSS-ul dat selector.

Cu alte cuvinte, rezultatul este același cu elem.querySelectorAll(css), dar acesta din urmă caută toate elementele și alege unul, în timp ce elem.querySelector doar caută unul. Deci, scrierea este mai rapidă și mai scurtă.

potriviri

Metodele anterioare căutau în DOM.

Elem.matches (css) nu caută nimic , doar verifică dacă elem se potrivește cu selectorul CSS dat. Returnează true sau false.

Metoda este utilă atunci când facem o iterație asupra elementelor (ca într-un matrice sau ceva) și încercând să le filtrăm pe cele care ne interesează.

De exemplu:

cel mai apropiat

Strămoșii unui element sunt: părinte părinte, părinte și așa mai departe. Strămoșii formează împreună lanțul părinților de la element la vârf.

Metoda elem.closest(css) caută cel mai apropiat strămoș care se potrivește cu selectorul CSS. elem în sine este, de asemenea, inclus în căutare.

Cu alte cuvinte, metoda closest crește de la element și verifică fiecare părinte. Dacă se potrivește cu selectorul, atunci căutarea se oprește și strămoșul este returnat.

De exemplu:

getElementsBy *

Există și alte metode de căutat pentru noduri cu etichetă, clasă etc.

Astăzi, acestea sunt în mare parte istorie, deoarece querySelector este mai puternic și mai scurt de scris.

Deci, aici le acoperim în principal pentru completitudine, în timp ce le puteți găsi în scripturile vechi.

  • elem.getElementsByTagName(tag) caută elemente cu cele date etichetați și returnează colecția acestora. Parametrul tag poate fi, de asemenea, o stea "*" pentru „orice etichete”.
  • elem.getElementsByClassName(className) returnează elemente care au clasa CSS dată.
  • document.getElementsByName(name) returnează elemente cu atributul name dat, la nivel de document. Foarte rar folosit.

De exemplu:

Să găsim toate etichetele input în interiorul tabelului:

Nu uitați "s" scrisoare!

Dezvoltatorii începători uită uneori litera "s". Adică încearcă să apeleze getElementByTagName în loc de getElementsByTagName.

"s" litera este absentă în getElementById, deoarece returnează un singur element. Dar getElementsByTagName returnează o colecție de elemente, deci există "s" în interior.

Returnează o colecție, nu un element!

O altă greșeală larg răspândită pentru începători este să scrieți:

Asta nu va funcționa, deoarece ia o colecție de intrări și îi atribuie valoarea, mai degrabă decât elementelor din interior.

Ar trebui fie să repetați colecția, fie să obținem un element după indexul său, apoi să atribuim, astfel:

Caută elemente .article:

Colecții live

Toate metodele "getElementsBy*" returnează o colecție live. Astfel de colecții reflectă întotdeauna starea curentă a documentului și „actualizarea automată” atunci când acesta se modifică.

În exemplul de mai jos, există două scripturi.

  1. Primul creează o referință la colecția de <div>. De acum, lungimea sa este 1.
  2. Al doilea script rulează după ce browserul întâlnește încă un <div>, deci lungimea acestuia este 2.

În contrast , querySelectorAll returnează o colecție statică. Este ca o matrice fixă de elemente.

Dacă o folosim în schimb, atunci ambele scripturi produc 1:

Acum putem vedea cu ușurință diferența. Colecția statică nu a crescut după apariția unui nou div în document.

Rezumat

Există 6 metode principale pentru a căuta noduri în DOM:

Metodă Căutări după … Poate cal Am un element? Live?
querySelector CSS-selector
querySelectorAll CSS-selector
getElementById id
getElementsByName name
getElementsByTagName etichetă sau "*"
getElementsByClassName class

De departe cele mai utilizate sunt querySelector și querySelectorAll, dar getElement(s)By* poate fi sporadic de ajutor sau poate fi găsit în scripturile vechi.

Pe lângă asta:

  • Există elem.matches(css) pentru a verifica dacă elem se potrivește cu selectorul CSS dat.
  • Există elem.closest(css) pentru a căuta cel mai apropiat strămoș care se potrivește selectorul CSS dat. elem este, de asemenea, verificat.

Și să menționăm încă o metodă aici pentru a verifica relația copil-părinte, deoarece uneori este utilă:

  • elemA.contains(elemB) returnează adevărat dacă elemB se află în elemA (un descendent al lui elemA) sau când elemA==elemB.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *