Ce este un arbore de elemente ale unui document html. Structurarea datelor folosind JavaScript: arbore. Selectați articolele după tip
mai tânără). Toate elementele arborelui sunt descendenţi rădăcină, și asta este a lor strămoş. În acest caz, toate elementele și textele care formează conținutul lor sunt noduri arborele documentelor.
Fiecare element din acest arbore corespunde unui element HTML și, prin urmare, are etichete, conținut și un set de atribute. Pentru a trece la modelul de obiect de document, mai rămâne un singur pas de făcut: apelați toate obiectele elementelor arborelui și faceți atributele acestora lizibile și modificabile din scripturi și applet-uri. Ca rezultat, arborele elementelor documentului HTML devine gestionat dinamic; Mai mult, acum putem adăuga cu ușurință noi proprietăți fiecărui element, în plus față de atributele standard HTML.
Această abordare a fost folosită ca bază pentru modelul HTML dinamic al browserelor Microsoft și apoi adoptată ca bază pentru standardele W3C, numite model obiect document(Document Object Model sau DOM). În același timp, W3C a extins conceptul de DOM la orice document XML, considerând DOM-ul HTML ca un caz special specializat, cu capabilități suplimentare. Astfel, DOM este un model de document HTML și XML independent de platformă și limbă care definește:
- interfețe și obiecte care sunt utilizate pentru a reprezenta și manipula un document;
- semantica acestor interfețe și obiecte, inclusiv atributele și reacțiile lor la evenimente;
- relaţiile dintre aceste interfeţe şi obiecte.
Până în prezent, W3C a standardizat nivelurile DOM unu și doi (DOM 1 și DOM 2);
- DOM 3 este în stadiul de proiect de lucru Aceste acronime reprezintă, respectiv, următoarele:
- DOM 1 descrie reprezentarea de bază a documentelor XML și HTML ca arbori de obiecte;
- DOM 2 extinde interfețele de bază DOM 1 și adaugă suport pentru evenimente și stiluri;
DOM 3 descrie încărcarea și analizarea documentelor, precum și afișarea și formatarea acestora.
- Având în vedere starea actuală a lucrurilor, luăm în considerare doar DOM 2 (și DOM 1 pe care îl conține) aici.
- DOM 2 constă din următoarele grupuri de interfețe interconectate:
- Interfețe de evenimente care determină ordinea generării și procesării evenimentelor;
- Interfețe de stil care definesc aplicarea foilor de stil la documente;
- Interfețe Traversal & Range care definesc traversarea arborelui documentului și manipularea zonelor conținutului acestuia;
- Interfețe HTML care definesc o vizualizare arborescentă a unui document HTML.
Să începem prin a defini interfețele de bază care stau la baza tuturor specificațiilor ulterioare.
4.2.2. Concepte de bazăDOM 2 Core reprezintă documentele XML ca arbori formați din noduri, care la rândul lor sunt și obiecte și implementează interfețe mai specializate. Unele tipuri de noduri pot avea copii, adică ei înșiși sunt subarbori, în timp ce altele sunt frunze, adică nu au copii. Următorul tabel rezumă toate tipurile de noduri de document abstract posibile;
Descrierea interfeței Copii | Document | |
Element (max. unul), ProcessingInstruction , Comment , DocumentType (max. unul) | Fragment de document | |
Element, ProcessingInstruction, Comentariu, Text, CDATASection, EntityReference | DocumentType | Tip document |
nu are copii | EntityReference | Fragment de document |
Link secțiune | Element | Fragment de document |
Element | Attr | Atribut |
Text, EntityReference | Instrucțiuni de procesare | Tip document |
Directiva XML | Comentariu | Tip document |
Comentariu | Text | Tip document |
Text | Secțiunea CDATA | Tip document |
secțiunea CDATA | Entitate | Fragment de document |
Capitol | Notaţie | Tip document |
Notaţie În plus, DOM 2 Core conține specificația interfețelor NodeList (liste ordonate de noduri accesibile după număr din listă) și NamedNodeMap (liste neordonate de noduri accesibile după numele lor). Aceste obiecte suntîn viaţă
, adică orice modificare a unui document implică automat o modificare a tuturor listelor asociate acestuia. Trebuie subliniat faptul că DOM 2 Core conține două seturi de interfețe, fiecare dintre acestea oferind acces deplin la toate elementele documentului. Primul set reprezintă o abordare orientată pe obiecte cu următoarea ierarhie de moștenire: documentați elementele constitutive ale acestora atributele și conținutul textului. Când luăm în considerare arborele de documente în acest fel, vorbim despre ierarhia obiectelor . A doua abordare se bazează pe principiul „totul este noduri (Noduri)”.. Astfel, DOM 2 este în mod inerent redundant, dar ne oferă posibilitatea de a vizualiza documentul într-un fel sau altul, în funcție de sarcină.
Toate interfețele DOM 2 Core sunt împărțite în de bază (fundamentale) și suplimentare (extinse).
Principalele interfețe sunt , , , , Node , NodeList , NamedNodeMap , CharacterData , Attr , Element , Text și Comment . Aceste interfețe trebuie să fie acceptate de toate implementările DOM, atât pentru documentele XML, cât și pentru HTML. Interfețele suplimentare vizează documente XML, așa că este posibil ca implementările HTML DOM să nu le accepte. Acestea includ CDATASection, DocumentType, Notation, Entity, EntityReference și ProcessingInstruction.
Pentru independența limbii și a platformei, DOM definește următoarele tipuri: DOMstring Un șir de text format din caractere Unicode în format UTF-16.În JavaScript și Java este implementat de tipul String.DOMTimeStamp
Data și ora într-un format acceptabil pentru limba respectivă. De exemplu, în JavaScript acesta ar fi un obiect Date, iar în Java ar fi un întreg de tip lung care conține numărul de milisecunde.
Mai jos este o scurtă descriere a tuturor interfețelor DOM, indicând nivelul modelului (DOM 1 sau DOM 2) în care este definită această sau acea proprietate a interfeței. Specificațiile W3C sunt scrise în limbajul IDL independent de platformă. Le prezentăm în conformitate cu sintaxa JavaScript, care este principalul limbaj de scripting astăzi.Împreună cu o descriere a standardului, oferim o scurtă descriere a implementării acestuia în modelele de obiecte Microsoft și Gecko. Trebuie remarcat faptul că implementările Microsoft pentru XML și HTML sunt complet independente (sunt implementate de componentele software XMLDOM și, respectiv, MSHTML), în timp ce în Gecko modelul obiect este același pentru documentele HTML și XML. Următoarea discuție se concentrează pe DOM pentru HTML; XML DOM va fi discutat în detaliu în Partea VIII.
Tabelul 4.2. Excepții DOM standard | 1 | Nume Valoare Descriere Model | INDEX_SIZE_ERR |
Indicele este în afara intervalului. | 2 | DOM 1 | INDEX_SIZE_ERR |
DOMSTRING_SIZE_ERR | 3 | Textul dat nu poate fi transmis la tip . | INDEX_SIZE_ERR |
HIERARCHY_REQUEST_ERR | 4 | Tip de document nevalid. | INDEX_SIZE_ERR |
INVALID_CHARACTER_ERR | 5 | A fost întâlnit un caracter nevalid. | INDEX_SIZE_ERR |
NO_DATA_ALLOWED_ERR | 6 | Nodul nu conține date. | INDEX_SIZE_ERR |
NO_MODIFICATION_ALLOWED_ERR | 7 | S-a încercat modificarea unui obiect în mod ilegal. | INDEX_SIZE_ERR |
NOT_FOUND_ERR | 8 | Accesarea unui nod inexistent. | INDEX_SIZE_ERR |
NOT_SUPPORTED_ERR | 9 | Parametrul sau operația nu este implementată. | INDEX_SIZE_ERR |
INUSE_ATTRIBUTE_ERR | 10 | S-a încercat să se adauge un atribut care există deja. | INDEX_SIZE_ERR |
INVALID_STATE_ERR | 11 | Referindu-se la un obiect inexistent. | INDEX_SIZE_ERR |
SYNTAX_ERR | 12 | Eroare de sintaxă. | DOM 2 |
INVALID_MODIFICATION_ERR | 13 | S-a încercat să se schimbe tipul unui obiect. | DOM 2 |
NAMESPACE_ERR | 14 | S-a încercat crearea sau modificarea unui obiect care nu este conform cu spațiul de nume XML. | DOM 2 |
INVALID_ACCESS_ERR | 15 | Parametrul sau operația nu este acceptată de obiect. | DOM 2 |
Unele coduri de eroare sunt acceptate.
4.2.4. Descrierea implementării: Interfață DOMImplementation Suport: Numai pentru documente XML (XMLDOMImplementation). Conform DOM 1. : Interfața DOMImplementation conține metode a căror execuție nu depinde de un anumit model de obiect de document. Este accesibil prin intermediul obiectului . metoda createCSSStyleSheetSintaxă
obiect Conform DOM 1. : Interfața DOMImplementation conține metode a căror execuție nu depinde de un anumit model de obiect de document. Este accesibil prin intermediul obiectului ..createCSSStyleSheet(title, media) Argumente: titlu, expresii tip media Rezultat: nou obiect CSSStyleSheet Excepții: SYNTAX_ERR SuportMetoda createCSSStyleSheet creează un nou obiect CSSStyleSheet și returnează un pointer către acesta. Această metodă ar trebui să fie acceptată numai de implementările DOM care acceptă CSS.
Obiectul este creat în afara contextului documentului; DOM 2 nu vă permite să includeți o foaie de stil nou creată într-un document. Conform DOM 1. : Interfața DOMImplementation conține metode a căror execuție nu depinde de un anumit model de obiect de document. Este accesibil prin intermediul obiectului ..createDocumentType(qualifiedName, publicId, systemId) Argumente: expresii de tip qualifiedName, publicId, systemId Rezultat: nou nod DocumentType Excepții Suport: Neacceptat.Nu este acceptat.
Metoda createDocumentType creează un nod DocumentType gol și returnează un pointer către acesta. Este destinat documentelor XML și este posibil să nu fie acceptat pentru documente HTML. Argumentul qualifiedName specifică numele calificat al tipului de document care urmează să fie creat, publicId este identificatorul public al secțiunii externe și systemId este identificatorul de sistem al secțiunii externe. Conform DOM 1. : Interfața DOMImplementation conține metode a căror execuție nu depinde de un anumit model de obiect de document. Este accesibil prin intermediul obiectului . metoda hasFeature.hasFeature(feature, version) Argumente: caracteristică, expresii tip versiune Rezultat: boolean Excepții: niciuna Suport
Metoda hasFeature returnează true dacă implementarea DOM acceptă caracteristica specificată și false în caz contrar. Numele proprietății (în orice caz) este specificat de argumentul caracteristicii; trebuie să respecte convențiile de denumire XML. Argumentul versiune specifică numele versiunii proprietății care este verificată. Dacă nu este specificat, true este returnat dacă cel puțin o versiune a acestei proprietăți este acceptată.
În Gecko, valorile caracteristicilor pot fi șirurile „XML” și „HTML”, iar valoarea versiunii poate fi șirurile „1.0” și „2.0”. Exemplu:
Alert(document.implementation.hasFeature("HTML", "1.0")); alert(document.implementation.hasFeature("HTML", "2.0")); alert(document.implementation.hasFeature("HTML", "3.0"));
Primele două instrucțiuni de alertă vor scoate șirul true , iar a treia va scoate false .
În Microsoft XMLDOM, valorile caracteristicilor pot fi șirurile „XML”, „DOM” și „MS-DOM”, iar valoarea versiunii poate fi șirul „1.0”. Exemplu:
Var objDoc = new ActiveXObject ("Microsoft.XMLDOM"); alert(objDoc.implementation.hasFeature("XML", "1.0")); alert(objDoc.implementation.hasFeature("XML", "2.0"));
Prima declarație de alertă va scoate șirul true , iar a doua va scoate false .4.2.5. Fragment de document: Interfață DocumentFragment Suport: Numai pentru documente XML (XMLDOMDocumentFragment). Conform DOM 1. Interfața DocumentFragment este un descendent al interfeței Node și moștenește toate proprietățile și metodele acesteia. După cum sugerează și numele, este conceput pentru operațiuni cu
4.2.6. Document: Interfață pentru documente Suport: Suportat pentru documente XML (XMLDOMDocument);pentru documentele HTML este parțial acceptat.
INDEX_SIZE_ERR | Metode de interfață pentru documente | |
DOM 2 | Descrierea modelului de proprietate | |
INDEX_SIZE_ERR | Creează un atribut. | |
INDEX_SIZE_ERR | Creează un atribut dat un spațiu de nume. | |
INDEX_SIZE_ERR | Creează o secțiune CDATA. | |
INDEX_SIZE_ERR | Creează un comentariu. | |
DOM 2 | Creează un nou fragment de document. | |
INDEX_SIZE_ERR | Creează un nou element. | |
DOM 2 | Creează un element cu un spațiu de nume dat. | |
INDEX_SIZE_ERR | Creează un link către o secțiune. | |
INDEX_SIZE_ERR | Creează un nou obiect Eveniment. | |
DOM 2 | Creează o directivă. | |
INDEX_SIZE_ERR | Creează un nou nod de text. | |
DOM 2 | Returnează elementul cu ID-ul dat. | |
DOM 2 | Returnează o colecție de toate elementele care au eticheta dată. |
document
.doctype Editabil: fără suport Conform DOM 1. : Importă un nod dintr-un alt document. Proprietatea doctype returnează tipul acestui document (tip DocumentType).Pentru documentele HTML și pentru documentele XML care nu au o declarație de tip de document, este returnat null.
proprietatea documentElement
.documentElement Mutabil: nu Suport: Conform standardului.
Îndeplinește standardul. Conform DOM 1. : Importă un nod dintr-un alt document. Proprietatea documentElement returnează elementul rădăcină al acestui document (de tip Element). Pentru documentele HTML, elementul HTML este returnat.Exemplu: operator
Alert(document.documentElement.tagName); Conform DOM 1. : Importă un nod dintr-un alt document. va afișa un șir HTML pe ecran.Proprietatea de implementare
.implementare Editabil: nu Suport: Numai pentru documente XML. Conform DOM 1. : Importă un nod dintr-un alt document. Respectă DOM 1.Metoda createAttribute creează un nou obiect de tip Attr și returnează un pointer către acesta. Argumentul nume specifică numele atributului de creat. Noul obiect are un atribut nodeName de nume și un localName, prefix și atribute namespaceURI de null. Ulterior, atributul creat poate fi atribuit oricărui element folosind metoda Element.setAttributeNode.
Exemplu de creare a unui atribut pentru un element HTML:
Var myDiv = document.getElementById("idDiv"); var attr = document.createAttribute("temp"); attr.value = "temporar"; myDiv.setAttributeNode(attr); alert(myDiv.getAttribute("temp"));!}
Operatorul de alertă va imprima șirul temporar.
Un exemplu de creare a unui atribut în Microsoft XMLDOM:
Var xmlDoc = new ActiveXObject ("Microsoft.XMLDOM"); xmlDoc.async = false; xmlDoc.load("c:\Documentele mele\books.xml"); var root = xmlDoc.documentElement; var newAttr = xmlDoc.createAttribute("temp"); newAttr.value = "temporar"; root.setAttributeNode(attr); alert(root.getAttribute("temp"));!}
Aici operatorul de alertă va tipări și șirul temporar.
metoda createAttributeNS Conform DOM 1. : Importă un nod dintr-un alt document..createAttributeNS(namespaceURI, qualifiedName) Argumente: namespaceURI, qualifiedName tip expresii Rezultat: nou obiect Attr Excepții: INVALID_CHARACTER_ERR, NAMESPACE_ERR Suport: Neacceptat.Nu este acceptat.
Metoda createAttributeNS creează un nou obiect Attr și returnează un pointer către acesta. Este destinat documentelor XML și este posibil să nu fie acceptat pentru documente HTML.
Argumentul namespaceURI specifică URI-ul spațiului de nume, iar qualifiedName este numele calificat al atributului care urmează să fie creat în acel spațiu de nume. Obiectul creat de tip Attr are următoarele atribute: Conform DOM 1. : Importă un nod dintr-un alt document. Ulterior, atributul creat poate fi atribuit oricărui element folosind metoda Element.setAttributeNode.metoda createCDATASection
.createCDATASection(data) Argumente : expresie tip de date Rezultat : obiect CDATASection nou Excepții : NOT_SUPPORTED_ERR Suport : Conform standardului.
Îndeplinește standardul. Conform DOM 1. : Importă un nod dintr-un alt document..createComment(data) Argumente : expresie tip de date Rezultat : nou obiect Comentariu Excepții : niciuna Suport : numai pentru documente XML.Îndeplinește standardul.
Metoda createComment creează un nou obiect Comment și returnează un pointer către acesta. Argumentul de date specifică conținutul comentariului care urmează să fie creat. Un exemplu de creare a unui comentariu în Gecko:
Var root = document.documentElement.firstChild; var comm = document.createComment("Acesta este un comentariu."); root.appendChild(com); Conform DOM 1. : Importă un nod dintr-un alt document. metoda createDocumentFragment.createDocumentFragment() Rezultat: obiect nou Excepții: niciuna Suport: Numai pentru documente XML.
Îndeplinește standardul.
Metoda createDocumentFragment creează un nou obiect gol de tip și returnează un pointer către acesta. Un exemplu de creare a unui fragment de document în Gecko: Conform DOM 1. : Importă un nod dintr-un alt document. Var elem = document.documentElement.firstChild; var o = document.createDocumentFragment(); elem.appendChild(o);metoda createElement
.createElement(tagName) Argumente : expresie tip tagName Rezultat : obiect element nou Excepții : INVALID_CHARACTER_ERR Suport : Conform standardului (vezi nota 2).
Pentru XML, numele etichetelor de elemente sunt sensibile la majuscule. Pentru HTML, acestea pot fi setate în orice caz, dar sunt convertite în majuscule atunci când elementul este creat. | Încercarea de a crea un element FRAME sau IFRAME în Internet Explorer are ca rezultat fie o eroare fatală a browserului, fie, cel puțin, distrugerea completă a arborelui obiect document. |
Comportamentul tipului de nod | ATTRIBUTE_NODE |
Atributul ownerElement este nul , specificat este adevărat . Toți copiii nodului original sunt copiați recursiv în noul nod Attr, indiferent de valoarea deep. | DOCUMENT_FRAGMENT_NODE |
Dacă deep este true , atunci fragmentul de document specificat este importat; în caz contrar, se creează un nod gol. | Toate atributele nodului original sunt copiate în noul nod Element, cu excepția celor specificate implicit în documentul sursă. Sunt create apoi atributele implicite acceptate în acest document pentru elementele cu acest nume. Dacă deep este adevărat, atunci întregul subarboresc al elementului original este importat. |
ENTITY_NODE | Entitate DocumentType Noduri |
ENTITY_REFERENCE_NODE | Doar nodul EntityReference în sine este copiat, indiferent de valoarea deep. |
Dacă documentul nostru are o definiție de secțiune cu un nume dat, atunci este introdus într-un nou nod. | NOTATION_NODE |
Nodurile de notație pot fi importate, dar în DOM 2 DocumentType este doar pentru citire, așa că importarea unor astfel de noduri nu are sens. | PROCESSING_INSTRUCTION_NODE |
Sunt copiate valorile țintei și atributele de date ale nodului sursă. | TEXT_NODE, CDATA_SECTION_NODE, COMMENT_NODE |
Sunt copiate valorile datelor și atributelor de lungime ale nodului sursă.
Întocmit de: Evgeny Ryzhkov Data publicării: 15.11.2010
Un arbore de document este o diagramă pentru construirea unui document HTML care arată relațiile dintre diferitele elemente ale paginii: ordinea și imbricarea elementelor. Această diagramă ajută la navigarea în această mizerie aparent haotică a etichetelor HTML.
Arborele documentelor ajută un dezvoltator web atunci când scrie reguli CSS și scripturi Javascript.Nota
Nu confundați arborele documentului cu modelul obiect document (DOM). DOM este un concept mai complex (va fi scris despre el puțin mai târziu).
Pentru a nu intra în explicații lungi și plictisitoare despre motivul pentru care un arbore de document a fost numit arbore, să ne uităm la un exemplu - luați un cod HTML simplu:
Titlul paginii Titlul principal
- paragraf de text.
- punctul 1
Al doilea titlu
Așa este văzut codul HTML de către nativii neluminați care au făcut clic accidental pentru a vedea codul paginii. Dar ochiul instruit al unui dezvoltator web îl va dezasambla, va vedea toate nivelurile de imbricare și interconectare. Va construi din haos o structură ierarhică clară sub forma unui arbore (deoarece diagrama este similară cu conturul unui arbore):Legături de familie
Există anumite conexiuni între elementele arborelui documentului. Să ne uităm la ele.Strămoși și descendenți
Din imaginea schematică a arborelui și din codul HTML în sine, este clar că unele elemente sunt imbricate în altele. Elementele care conțin altele sunt strămoșii a tot ceea ce este conținut în el. Cei cuibăriți, la rândul lor, sunt descendenții acestuia (descendenții).
Fiecare strămoș poate avea un număr nelimitat de descendenți. Fiecare descendent va avea un număr de strămoși în funcție de structura arborelui și pe ce ramură va fi amplasat, dar în orice caz va exista cel puțin un strămoș.
Părinți și fiicePărintele este strămoșul imediat (strămoșul de prim nivel) al unui element. În schimb, copilul imediat (copilul de primul nivel) se numește copil.
Fiecare părinte poate avea un număr nelimitat de fiice. Un element copil va avea un singur părinte.
Un element părinte este numit și strămoș direct, iar un element copil este descendent direct. Acestea sunt ceva de genul numelor semantice.
Elemente suroriFrații sunt un grup de două sau mai multe elemente care au un părinte comun. Elementele nu trebuie să fie de același tip, trebuie doar să aibă un părinte comun.
Elemente adiacenteElementele adiacente sunt elemente surori care sunt situate în „cartier”.
Sora anterioară și sora următoareTotul aici ar trebui să fie clar din numele termenilor înșiși. Frate anterior - elementul soră anterior prin cod. Folosind exemplul nostru de ramură pentru
- va fi
- paragraf de text.
- punctul 1
Pentru
- și căci nu va exista nicio fărătate anterioară.
În mod similar, următoarea soră (următoarea frate): pentru -
Pentru
—
- , Pentru
- - Nu. Anterior și următorul
Elementul anterior (precedent) - același element anterior conform codului, numai fără restricții ale relațiilor cu sora. Pentru filiala noastră: pentru
- va fi
Pentru
- , Pentru - .
În acest articol, aș dori să vă spun ce este un arbore de document în HTML și cum sunt conectate elementele din acesta.
Într-un document html, multe etichete sunt imbricate în altele, de exemplu:
< html> < head> < title>Exemplu de titlu< body> < div class = ”container”> < h1>Ceva important< div class = ”left”> < h2>Informații puțin mai puțin importante< p>Conținutul paginii< ul> < li>Punctul 1< li>Punctul 2< li>Punctul 3
Așa arată codul paginii, dar dezvoltatorul îl vede diferit. Acest set haotic de simboluri, datorită înțelegerii structurii documentului, este construit într-o schemă clar definită. Deci vede că capul și corpul sunt imbricate în html, iar h2 p ul în clasa div = „stânga” și așa mai departe.
Arborele documentului este o reprezentare schematică a codului paginii, reflectând relațiile dintre etichete.
La rândul lor, în funcție de natura conexiunii care unește elementele paginii, acestea sunt împărțite în strămoși și descendenți, părinți și fiice, elemente surori etc.
Există anumite conexiuni între elementele arborelui documentului. Să ne uităm la ele.După cum s-a menționat mai sus, în codul html un element poate include alții în interiorul său. Prin urmare, o etichetă în care există alte etichete se numește strămoș, iar acești „ceilalți” sunt numiți descendenți.
Numărul descendenților strămoșilor nu este limitat de nimic. Numărul de strămoși va depinde de locația elementului în structura documentului.
Părinți și fiiceStrămoșul care are primul nivel de cuibărit se numește părinte, iar descendentul conținut direct în el se numește copil.
Nu există o limită a numărului de elemente copil conținute într-un părinte, dar copiii pot avea doar un părinte.
Părinții și fiicele sunt de asemenea numiți uneori strămoși direcți și descendenți direcți.
Să ne uităm la exemplul nostruCapul este părintele și strămoșul titlului și este copilul și copilul capului; h2, p, ul, li sunt copii ai div class=”left”, în timp ce li este simultan un copil al ul și div class=”left”, și numai ul este părintele lui li. Aceasta este principala diferență dintre un strămoș și un părinte și o fiică și un descendent.
FrațiAcestea includ elemente copil care au un părinte comun.
Etichetele surori le pasă doar de a avea un părinte comun, iar tipul de element poate fi diferit, de exemplu:
h2, p, ul, sunt surori și aparțin clasei părinte div=”stânga”, în același timp toți li vor fi, de asemenea, surori numai sub părintele ul.
AdiacentEtichete care stau una lângă alta în structura documentului și au un singur părinte.
Deci, pentru exemplul nostru, h2 este adiacent cu p, ul este adiacent cu p și p este adiacent cu ul și h2 în același timp.
Surorile anterioare și următoareTotul este simplu aici: următorul element soră (următorul frate) - conform codului, vine imediat după eticheta care ne interesează și are un părinte comun cu aceasta, iar elementul soră anterior (precedentul fratelui) este o etichetă care precede al nostru și are și un părinte singur cu el.
Anterior și următorulSunt extrem de asemănătoare cu conexiunile pe care tocmai le-am descris, dar există nuanțe - în acest caz, prezența unui părinte comun nu contează pentru noi. De exemplu, dacă nu există nicio etichetă soră anterioară pentru h2, atunci pur și simplu cea anterioară (precedentă) va fi div class = „stânga”, cu următoarea (precedentă) aceeași imagine.
Primul și ultimul copilPrimul copil (primul copil) este elementul copil care este primul pentru părintele său, ultimul copil (ultimul copil) este ultima etichetă din interiorul părintelui.
De exemplu, pentru div class="left" primul copil va fi h2, iar ultimul copil va fi ul.
Element rădăcinăEste considerată o etichetă care nu are nici strămoși, nici părinți. Include toate „ramurile” arborelui nostru și se deschide chiar la începutul documentului (< html>) și se închide la sfârșit ( ).
RezumândÎnțelegerea structurii arborelui de elemente, precum și a tuturor conexiunilor aferente din acesta, nu numai că vă va ajuta să navigați ușor și rapid prin cod, dar vă va face și să selectați mai ușor și mai precis etichetele de care avem nevoie în CSS.
Întocmit de: Evgeny Ryzhkov Data publicării: 15.11.2010
Un arbore de document este o diagramă pentru construirea unui document HTML care arată relațiile dintre diferitele elemente ale paginii: ordinea și imbricarea elementelor. Această diagramă ajută la navigarea în această mizerie aparent haotică a etichetelor HTML.
Arborele documentelor ajută un dezvoltator web atunci când scrie reguli CSS și scripturi Javascript.Nota
Nu confundați arborele documentului cu modelul obiect document (DOM). DOM este un concept mai complex (va fi scris despre el puțin mai târziu).
Pentru a nu intra în explicații lungi și plictisitoare despre motivul pentru care un arbore de document a fost numit arbore, să ne uităm la un exemplu - luați un cod HTML simplu:
Titlul paginii Titlul principal
Al doilea titlu
Așa este văzut codul HTML de către nativii neluminați care au făcut clic accidental pentru a vedea codul paginii. Dar ochiul instruit al unui dezvoltator web îl va dezasambla, va vedea toate nivelurile de imbricare și interconectare. Va construi din haos o structură ierarhică clară sub forma unui arbore (deoarece diagrama este similară cu conturul unui arbore):Legături de familie
Există anumite conexiuni între elementele arborelui documentului. Să ne uităm la ele.Strămoși și descendenți
Din imaginea schematică a arborelui și din codul HTML în sine, este clar că unele elemente sunt imbricate în altele. Elementele care conțin altele sunt strămoșii a tot ceea ce este conținut în el. Cei cuibăriți, la rândul lor, sunt descendenții acestuia (descendenții).
Fiecare strămoș poate avea un număr nelimitat de descendenți. Fiecare descendent va avea un număr de strămoși în funcție de structura arborelui și pe ce ramură va fi amplasat, dar în orice caz va exista cel puțin un strămoș.
Părinți și fiicePărintele este strămoșul imediat (strămoșul de prim nivel) al unui element. În schimb, copilul imediat (copilul de primul nivel) se numește copil.
Fiecare părinte poate avea un număr nelimitat de fiice. Un element copil va avea un singur părinte.
Un element părinte este numit și strămoș direct, iar un element copil este descendent direct. Acestea sunt ceva de genul numelor semantice.
Elemente suroriFrații sunt un grup de două sau mai multe elemente care au un părinte comun. Elementele nu trebuie să fie de același tip, trebuie doar să aibă un părinte comun.
Elemente adiacenteElementele adiacente sunt elemente surori care sunt situate în „cartier”.
Sora anterioară și sora următoareTotul aici ar trebui să fie clar din numele termenilor înșiși. Frate anterior - elementul soră anterior prin cod. Folosind exemplul nostru de ramură pentru
- va fi
Pentru
- și căci nu va exista nicio fărătate anterioară.
În mod similar, următoarea soră (următoarea frate): pentru -
Pentru
—
- , Pentru
- - Nu. Anterior și următorul
Elementul anterior (precedent) - același element anterior conform codului, numai fără restricții ale relațiilor cu sora. Pentru filiala noastră: pentru
- va fi
Pentru
- , Pentru - .
În mod similar, următorul element (precedent) nu are restricții pentru frați: pentru -
Pentru primul și ultimul copil
Primul copil este primul copil al părintelui din arborele de documente, iar ultimul copil este ultimul.
Element rădăcinăElementul rădăcină este strămoșul tuturor strămoșilor, este „rădăcina” arborelui nostru de documente, este singurul element care nu are părinte, este .
Lucrul cu modelul DOM
Fiecare obiect Window are o proprietate document care se referă la obiectul Document. Acest obiect Document nu este un obiect independent. Este obiectul central al unui API extins cunoscut sub numele de Document Object Model (DOM), care definește modul în care poate fi accesat conținutul documentului.
Prezentare generală a DOMDocument Object Model (DOM) este interfața fundamentală de programare a aplicațiilor care oferă capacitatea de a lucra cu conținutul documentelor HTML și XML. Interfața de programare a aplicațiilor (API) DOM nu este deosebit de complexă, dar există o mulțime de caracteristici arhitecturale de care ar trebui să fii conștient.
În primul rând, înțelegeți că elementele imbricate în documentele HTML sau XML sunt reprezentate ca un arbore de obiecte DOM. Vizualizarea arborescentă a unui document HTML conține noduri reprezentând elemente sau etichete, cum ar fi și
Și noduri reprezentând linii de text. Un document HTML poate conține și noduri reprezentând comentarii HTML. Luați în considerare următorul document HTML simplu:
Exemplu de document Acesta este un document HTML
Exemplu simplu text.
Reprezentarea DOM a acestui document este prezentată în următoarea diagramă:
Pentru cei care nu sunt familiarizați cu structurile arborescente în programarea computerelor, este util să știe că terminologia pentru descrierea acestora a fost împrumutată din arborii genealogici. Nodul situat direct deasupra acestui nod este numit părinteascăîn raport cu acest nod. Nodurile situate la un nivel sub alt nod sunt filialeîn raport cu acest nod. Sunt numite noduri care sunt la același nivel și au același părinte surori. Nodurile situate orice număr de niveluri sub alt nod sunt copiii acestuia. Părinte, bunicul și orice alte noduri de deasupra unui nod dat sunt strămoșii săi.
Fiecare dreptunghi din această diagramă este un nod de document, care este reprezentat de un obiect Node. Rețineți că figura prezintă trei tipuri diferite de noduri. Rădăcina arborelui este nodul Document, care reprezintă întregul document. Nodurile care reprezintă elemente HTML sunt noduri de tip Element, iar nodurile care reprezintă text sunt noduri de tip Text. Document, Element și Text sunt subclase ale clasei Node. Document și Element sunt cele mai importante două clase din DOM.
Tipul de nod și subtipurile sale formează ierarhia tipurilor prezentată în diagrama de mai jos. Observați diferențele formale dintre tipurile generice Document și Element și tipurile HTMLDocument și HTMLElement. Tipul Document reprezintă un document HTML și XML, iar clasa Element reprezintă un element al documentului respectiv. Subclasele HTMLDocument și HTMLElement reprezintă în mod specific un document HTML și elementele acestuia:
Un alt lucru de remarcat în această diagramă este că există un număr mare de subtipuri ale clasei HTMLElement care reprezintă tipuri specifice de elemente HTML. Fiecare dintre ele definește proprietăți JavaScript care reflectă atributele HTML ale unui anumit element sau grup de elemente. Unele dintre aceste clase specifice definesc proprietăți sau metode suplimentare care nu reflectă sintaxa limbajului de marcare HTML.
Selectarea elementelor documentuluiMunca majorității programelor client în limbajul JavaScript este oarecum legată de manipularea elementelor documentului. În timpul rulării, aceste programe pot utiliza documentul variabil global, care se referă la un obiect Document. Totuși, pentru a efectua orice manipulare asupra elementelor documentului, programul trebuie să obțină cumva sau să selecteze obiecte Element care se referă la acele elemente ale documentului. DOM definește mai multe moduri de selectare a elementelor. Puteți selecta un element sau elemente ale unui document:
prin valoarea atributului id;
prin valoarea atributului nume;
după numele etichetei;
după clasa sau numele claselor CSS;
prin potrivirea unui anumit selector CSS.
Toate aceste tehnici de eșantionare a elementelor sunt descrise în următoarele subsecțiuni.
Selectarea elementelor după valoarea atributului idToate elementele HTML au atribute id. Valoarea acestui atribut trebuie să fie unică în cadrul unui document — niciun element din același document nu trebuie să aibă aceeași valoare a atributului ID. Puteți selecta un element după o valoare unică a atributului id folosind metoda getElementById() a obiectului Document:
Var section1 = document.getElementById("section1");
Acesta este cel mai simplu și cel mai comun mod de a selecta elemente. Dacă scriptul dvs. trebuie să poată manipula un anumit set de elemente de document, atribuiți valori atributelor id ale acelor elemente și utilizați capacitatea de a le căuta folosind acele valori.
În versiunile de Internet Explorer anterioare IE8, metoda getElementById() caută valorile atributelor id fără a ține seama de majuscule și minuscule și returnează, de asemenea, elemente care se potrivesc cu valoarea atributului de nume.
Selectarea elementelor după valoarea atributului numeluiAtributul nume HTML a fost inițial destinat să numească elemente de formular, iar valoarea acestui atribut a fost folosită atunci când datele formularului au fost trimise la server. La fel ca atributul id, atributul name atribuie un nume unui element. Cu toate acestea, spre deosebire de id, valoarea atributului name nu trebuie să fie unică: mai multe elemente pot avea același nume, ceea ce este destul de comun atunci când este folosit în forme de butoane radio și casete de selectare. În plus, spre deosebire de id, atributul name este permis numai pentru anumite elemente HTML, inclusiv formulare, elemente de formular și .
Puteți selecta elemente HTML pe baza valorilor atributelor lor de nume folosind metoda getElementsByName() a obiectului Document:
Var radiobuttons = document.getElementsByName("culoare_favorită");
Metoda getElementsByName() nu este definită de clasa Document, ci de clasa HTMLDocument, deci este disponibilă numai în documentele HTML și nu este disponibilă în documentele XML. Returnează un obiect NodeList care se comportă ca o matrice numai în citire de obiecte Element.
În IE, metoda getElementsByName() returnează, de asemenea, elemente a căror valoare de atribut id se potrivește cu valoarea specificată. Pentru a asigura compatibilitatea între browsere, trebuie să fiți atenți atunci când alegeți valorile atributelor și să nu utilizați aceleași șiruri de caractere ca și valorile pentru atributele nume și id.
Selectați articolele după tipMetoda getElementsByTagName() a obiectului Document vă permite să selectați toate elementele HTML sau XML de un tip specificat (sau după numele etichetei). De exemplu, ați putea obține un obiect asemănător matricei numai pentru citire care conține obiectele Element ale tuturor elementelor din document, astfel:
Var spans = document.getElementsByTagName("span");
Similar cu metoda getElementsByName(), getElementsByTagName() returnează un obiect NodeList. Elementele documentului sunt incluse în tabloul NodeList în aceeași ordine în care apar în document, de exemplu. primul element
În document puteți alege:
Var firstParagraph = document.getElementsByTagName("p");
Numele etichetelor HTML nu țin cont de majuscule și minuscule, iar atunci când getElementsByTagName() este aplicat unui document HTML, efectuează o comparație care nu ține seama de majuscule și minuscule cu numele etichetei. Variabila spans creată mai sus, de exemplu, va include și toate elementele care sunt scrise ca .
Puteți obține un NodeList care conține toate elementele unui document prin trecerea caracterului wildcard „*” la metoda getElementsByTagName().
În plus, clasa Element definește și metoda getElementsByTagName(). Acționează exact ca versiunea de clasă Document a metodei, dar selectează numai elemente care sunt descendenți ai elementului pe care este apelată metoda. Adică, găsiți toate elementele din interiorul primului element
Puteți face acest lucru după cum urmează:
Var firstParagraph = document.getElementsByTagName("p"); var firstParagraphSpans = firstParagraph.getElementsByTagName("span");
Din motive istorice, clasa HTMLDocument definește proprietăți speciale pentru a accesa anumite tipuri de noduri. Proprietăți imagini, formeŞi link-uri, de exemplu, se referă la obiecte care se comportă ca matrice numai pentru citire care conțin elemente , Și (dar numai acele etichete , care au un atribut href). Aceste proprietăți se referă la obiecte HTMLCollection, care seamănă mult cu obiectele NodeList, dar pot fi indexate în plus după valorile atributelor id și name.
Obiectul HTMLDocument definește, de asemenea, proprietăți sinonime încorporate și pluginuri, care sunt colecții de elemente HTMLCollection. Proprietatea ancore nu este standard, dar poate fi folosită pentru a accesa elemente , care are un atribut de nume, dar nici un atribut href. Proprietatea scripts este definită de standardul HTML5 și este o colecție de elemente HTMLCollection.
În plus, obiectul HTMLDocument definește două proprietăți, fiecare dintre acestea nu se referă la o colecție, ci la un singur element. Proprietatea document.body reprezintă elementul document HTML, iar proprietatea document.head reprezintă elementul . Aceste proprietăți sunt întotdeauna definite în document: chiar dacă documentul sursă nu conține și elemente, browserul le va crea implicit. Proprietatea documentElement a unui obiect Document se referă la elementul rădăcină al documentului. În documentele HTML, acesta reprezintă întotdeauna .
Selectarea elementelor după clasa CSSValoarea atributului clasei HTML este o listă de zero sau mai mulți identificatori, separate prin spații. Vă permite să definiți seturi de elemente de document înrudite: orice elemente care au același identificator în atributul de clasă fac parte din același set. Clasa de cuvinte este rezervată în JavaScript, astfel încât JavaScript la nivel de client utilizează proprietatea className pentru a stoca valoarea atributului de clasă HTML.
De obicei, atributul class este folosit împreună cu foile de stil în cascadă CSS pentru a aplica un stil de randare comun tuturor membrilor unui set. Totuși, în plus, standardul HTML5 definește metoda getElementsByClassName(), care vă permite să selectați mai multe elemente de document pe baza identificatorilor din atributele lor de clasă.
La fel ca metoda getElementsByTagName(), metoda getElementsByClassName() poate fi apelată atât pe documente HTML, cât și pe elemente HTML și returnează un obiect NodeList live care conține toți descendenții documentului sau elementului care corespund criteriilor de căutare.
Metoda getElementsByClassName() acceptă un singur argument șir, dar șirul în sine poate conține mai mulți identificatori, separați prin spații. Toate elementele ale căror atribute de clasă conțin toți identificatorii specificați vor fi considerate potrivite. Ordinea identificatorilor nu contează. Rețineți că atât în atributul de clasă, cât și în argumentul metodei getElementsByClassName(), identificatorii de clasă sunt separați prin spații și nu prin virgule.
Mai jos sunt câteva exemple de utilizare a metodei getElementsByClassName():
// Găsiți toate elementele cu clasa "warning" var warnings = document.getElementsByClassName("warning"); // Găsiți toți descendenții unui element cu identificatori "log" // cu clasele "error" și "fatal" var log = document.getElementById("log"); var fatal = log.getElementsByClassName(„eroare fatală”);
Selectarea elementelor folosind selectoare CSSFoile de stil în cascadă CSS au constructe sintactice foarte puternice cunoscute sub numele de selectoare care vă permit să descrieți elemente sau seturi de elemente dintr-un document. Alături de standardizarea selectoarelor CSS3, un alt standard W3C cunoscut sub numele de Selectors API definește metode JavaScript pentru preluarea elementelor care se potrivesc cu un selector specificat.
Cheia acestui API este metoda querySelectorAll() a obiectului Document. Este nevoie de un singur argument șir cu un selector CSS și returnează un obiect NodeList reprezentând toate elementele documentului care se potrivesc cu selectorul.
Pe lângă metoda querySelectorAll(), obiectul document definește și o metodă querySelector(), care este similară cu metoda querySelectorAll(), cu excepția faptului că returnează doar primul element care se potrivește (în ordinea documentului), sau nulă dacă nu există elemente de potrivire.
Aceste două metode sunt definite și de clasa Elements. Când sunt apelați pe un element, întregul document este căutat pentru o potrivire pentru selectorul dat, iar apoi rezultatul este filtrat pentru a include numai descendenții elementului utilizat. Această abordare poate părea contraintuitivă, deoarece înseamnă că șirul selector poate include strămoșii elementului care se potrivește.
Structura documentului și navigarea documentelorDupă selectarea unui element de document, uneori este necesar să găsiți părți ale documentului legate structural (părinte, frați, copil). Un obiect Document poate fi considerat ca un arbore de obiecte Node. Tipul Nod definește proprietăți care vă permit să navigați într-un astfel de arbore. Există o altă interfață de aplicație pentru navigarea documentelor, cum ar fi arborele de obiecte Element.
Documentele ca arbori de noduriObiectul Document, obiectele sale Element și obiectele Text care reprezintă fragmente de text din document sunt toate obiecte Node. Clasa Node definește următoarele proprietăți importante:
parentNodeNodul părinte al acestui nod sau nul pentru nodurile care nu au părinte, cum ar fi Document.
childNodesUn obiect asemănător matricei care poate fi citit (NodeList) care oferă o reprezentare a nodurilor copil.
primulCopil, ultimulCopilPrimul și ultimul nod copil sau nul dacă nodul dat nu are noduri copil.
următorul Frate, precedentul FrateNodurile frate următoare și anterioare. Nodurile frați sunt două noduri care au același părinte. Ordinea în care apar corespunde ordinii din document. Aceste proprietăți leagă nodurile într-o listă dublu legată.
nodeTypeTipul acestui nod. Nodurile de tip Document au valoarea 9 în această proprietate. Noduri de tip Element - valoare 1. Noduri de text de tip Text - valoare 3. Noduri de tip Comentarii - valoare 8 și noduri de tip DocumentFragment - valoare 11.
nodeValueConținutul text al nodurilor Text și Comentariu.
nodeNameNumele unei etichete Element cu toate caracterele convertite în majuscule.
Folosind aceste proprietăți ale clasei Node, puteți face referire la cel de-al doilea nod copil al primului nod copil al obiectului Document, așa cum se arată mai jos:
Document.childNodes.childNodes == document.firstChild.firstChild.nextSibling
Să presupunem că documentul în cauză are următoarea formă:
TestHello World!
Apoi, al doilea nod copil al primului nod copil va fi elementul. În proprietatea nodeType conține valoarea 1, iar în proprietatea nodeName conține valoarea „BODY”.
Cu toate acestea, rețineți că acest API este extrem de sensibil la modificările textului documentului. De exemplu, dacă adăugați un singur avans de linie între etichetele și din acest document, acel caracter de avans de linie devine primul nod copil (nodul Text) al primului nod copil, iar al doilea nod copil devine elementul, nu .
Documentele ca arbori de elementeCând interesul principal este în elementele documentului în sine, mai degrabă decât în textul din ele (și spațiul alb dintre ele), este mult mai convenabil să utilizați o interfață de aplicație care vă permite să interpretați documentul ca un arbore de obiecte Element. , ignorând nodurile Text și Comment care fac, de asemenea, parte din document.
Prima parte a acestei interfețe de aplicație este proprietatea copiilor a obiectelor Element. La fel ca proprietatea childNodes, valoarea sa este un obiect NodeList. Totuși, spre deosebire de proprietatea childNodes, lista de copii conține doar obiecte Element.
Rețineți că nodurile Text și Comment nu au noduri copil. Aceasta înseamnă că proprietatea Node.parentNode descrisă mai sus nu returnează niciodată noduri de tip Text sau Comment. Valoarea proprietății parentNode a oricărui obiect Element va fi întotdeauna un alt obiect Element sau rădăcina arborelui - un obiect Document sau DocumentFragment.
A doua parte a interfeței aplicației pentru navigarea elementelor documentului este proprietățile obiectului Element, similare cu proprietățile pentru accesarea nodurilor copil și frate ale obiectului Node:
firstElementChild, lastElementChildSimilar cu proprietățile firstChild și lastChild, dar returnează elementele copil.
nextElementSibling, previousElementSiblingSimilar cu proprietățile nextSibling și previousSibling, dar returnează elementele frate.
childElementCountNumărul de elemente copil. Returnează aceeași valoare ca proprietatea children.length.
Aceste proprietăți de acces la elementele copil și frați sunt standardizate și implementate în toate browserele curente, cu excepția IE.