Î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.
NotaNu confundați arborele documentului cu modelul obiect document (DOM). DOM este un concept mai complex (vom scrie 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
- punctul 2
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 dezamăgi, 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 familieExistă anumite conexiuni între elementele arborelui documentului. Să ne uităm la ele.
Strămoși și descendențiDin 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 (strămoșii) a tot ceea ce este încorporat în el. Cei cuibăriți, la rândul lor, sunt descendenții acestuia (descendenții).
Pentru claritate, luați în considerare o ramură a copacului nostru:
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 în 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.
Elementul părinte se mai numește strămoș direct, iar elementul copil este numit descendent direct. Acestea sunt ceva ca nume 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
- , încorporat în el; în plus, fiecare element
- poate avea noduri
- acelasi nivel. Operațiuni cu arborele
Orice arbore conține noduri, care pot fi constructori de arbori individuali și vom defini operații atât pentru constructorii de noduri, cât și pentru arborele.
Nodul- date - valorile sunt stocate aici;
- parent - indică către elementul părinte al nodului;
- copii - indică către următorul nod din listă.
- _root - indică către nodul rădăcină al arborelui;
- traverseDF(callback) - traversează nodurile arborescente folosind metoda DFS;
- traverseBF(callback) - traversează nodurile de arbore folosind metoda BFS;
- conţine(date, traversare) - caută un nod arbore;
- add(data, toData, traverse) - adaugă un nod în arbore;
- remove(child, parent) - elimină un nod de arbore.
Acum să scriem codul arborelui.
Proprietățile noduluiPentru a-l implementa, vom defini mai întâi o funcție numită Node și apoi un constructor numit Arbore:
funcția Nod(date) ( this.data = data; this.parent = null; this.children = ; )
Fiecare instanță Node conține trei proprietăți: date, părinte și copii. Prima proprietate este folosită pentru a stoca datele asociate nodului. A doua proprietate indică un singur nod. A treia proprietate indică nodurile copil.
Proprietățile arboreluiSă definim constructorul nostru pentru Tree, care conține un constructor Node în corpul său:
funcția Arborele (date) ( var node = nou Nod (date); this._root = nod; )
Arborele conține două linii de cod. Prima linie creează o nouă instanță Node; a doua linie atribuie nodul ca element rădăcină al arborelui.
Definirea arborelui și nodului necesită doar câteva linii de cod. Dar acest lucru este suficient pentru a ne ajuta să definim datele ierarhice. Pentru a demonstra acest lucru, să folosim câteva exemple pentru a crea o instanță Tree:
var tree = arbore nou ("CEO"); // (date: „CEO”, părinte: nul, copii: ) tree._root;
Cu părinte și copii putem adăuga noduri ca copii ai _root și, de asemenea, să atribuim _root ca părinte al acelor noduri. Cu alte cuvinte, putem defini o ierarhie a datelor.
Metode de arboreVom crea următoarele cinci metode:
- traverseDF(callback) ;
- traverseBF(callback) ;
- conţine(date, traversare) ;
- adauga(copil, parinte);
- elimina (nod, părinte) .
Deoarece fiecare metodă necesită traversarea arborilor, implementăm mai întâi metode care definesc diferite tipuri de traversare a arborilor.
metoda traverseDF (callback).Metodă de parcurgere a unui copac utilizând căutarea în adâncime:
Tree.prototype.traverseDF = function(callback) ( // aceasta este o functie recursiva si numita instantaneu (function recurse(currentNode)) ( // pasul 2 pentru (var i = 0, length = currentNode.children.length; i< length; i++) { // шаг 3 recurse(currentNode.children[i]); } // шаг 4 callback(currentNode); // шаг 1 })(this._root); };
traverseDF(callback) conține un parametru cu numele callback-ului. (callback) este o funcție care va fi apelată mai târziu în traverseDF(callback) .
Corpul lui traverseDF(callback) include o altă funcție numită recurs. Aceasta este o funcție recursivă care se referă la ea însăși și se termină automat. Folosind pașii descriși în comentariile funcției recurse, voi descrie întregul proces pe care recursul îl folosește pentru a parcurge întregul arbore.
Aceștia sunt pașii:
- Numim recurs cu nodul rădăcină al arborelui ca argument. În prezent, currentNode indică nodul curent;
- Introducem o buclă for și o repetăm o dată pentru fiecare nod copil al currentNode , începând cu primul;
- În corpul buclei for, numim o funcție recursivă cu un nod copil pentru nodul currentNode. Ce nod este acesta depinde de iterația curentă a buclei for;
- Când currentNode nu mai are copii, ieșim din bucla for și apelăm (callback) pe care le-am transmis în timpul apelului traverseDF (callback).
Pașii 2 (terminarea sinelui), 3 (apelarea sinelui) și 4 (apel invers) sunt repeți până când fiecare nod din arbore a fost trecut.
Recursiunea este un subiect foarte complex. Pentru a-l înțelege, puteți experimenta implementarea noastră actuală a traverseDF(callback ) și încercați să înțelegeți cum funcționează.
Următorul exemplu demonstrează traversarea unui arbore folosind traverseDF(callback) . Pentru acest exemplu, voi crea mai întâi un arbore. Abordarea pe care o voi folosi nu este ideală, dar funcționează. Ar fi mai bine să folosim metoda de adăugare (valoare), pe care o implementăm în pasul 4:
var tree = arbore nou ("unul"); tree._root.children.push(nodul nou ("doi")); tree._root.children.parent = copac; tree._root.children.push(nodul nou(„trei”)); tree._root.children.parent = copac; tree._root.children.push(nodul nou(„patru”)); tree._root.children.parent = copac; tree._root.children.children.push(nodul nou ("cinci")); tree._root.children.children.parent = copac._rădăcină.copii; arbore._rădăcină.copii.copii.push(nodul nou(„șase”)); tree._root.children.children.parent = copac._rădăcină.copii; tree._root.children.children.push(nodul nou(„șapte”)); tree._root.children.children.parent = copac._rădăcină.copii; /* creează următorul arbore unu ├── doi │ ├── cinci │ └── șase ├── trei └── patru └── șapte */
Acum, să apelăm traverseDF(callback):
tree.traverseDF(function(node) ( console.log(node.data) )); /* imprimă următoarele rânduri pe consolă „cinci” „șase” „două” „trei” „șapte” „patru” „unu” */
metoda traverseBF(callback).Metodă de parcurgere a unui copac pe lățimea acestuia. Diferența dintre căutarea depth-first și breadth-first search este secvența în care sunt străbătute nodurile arborelui. Pentru a ilustra acest lucru, să folosim arborele pe care l-am creat pentru a implementa metoda traverseDF(callback):
/* arbore unu (adâncime: 0) ├── doi (adâncime: 1) │ ├── cinci (adâncime: 2) │ └── șase (adâncime: 2) ├── trei (adâncime: 1)── patru (adâncime: 1) └── șapte (adâncime: 2) */
Acum să transmitem același callback la traverseBF(callback) pe care l-am folosit pentru traverseDF(callback):
tree.traverseBF(function(node) ( console.log(node.data) )); /* imprimă următoarele rânduri pe consolă „unu” „două” „trei” „patru” „cinci” „șase” „șapte” */
Trimitem liniile către consolă, iar diagrama noastră arborescentă ne va arăta o imagine care reflectă principiul căutării pe lățime. Începeți cu nodul rădăcină; apoi treceți printr-un nivel și vizitați fiecare nod din acel nivel de la stânga la dreapta. Repetați acest proces până când toate nivelurile sunt finalizate. Să implementăm codul care va face ca acest exemplu să funcționeze:
Tree.prototype.traverseBF = function(callback) (var coada = new Queue(); queue.enqueue(this._root); currentTree = queue.dequeue(); while(currentTree)( pentru (var i = 0, lungime = curentTree.copii.lungime;< length; i++) { queue.enqueue(currentTree.children[i]); } callback(currentTree); currentTree = queue.dequeue(); } };
Voi explica definiția traverseBF (callback) pas cu pas:
- Creați o instanță de Queue ;
- Adăugați un nod care apelează traverseBF(callback) pe instanța Queue;
- Declaram o variabila currentNode si o initializam pentru nodul pe care tocmai l-am adaugat in coada;
- În timp ce currentNode indică către un nod, executăm codul în bucla while;
- Utilizați o buclă for pentru a parcurge nodurile fii ale curentului Nod;
- În corpul buclei for, adăugăm fiecare nod copil în coadă;
- Acceptăm currentNode și îl transmitem ca argument pentru callback;
- Setați currentNode la nodul care este eliminat din coadă;
- Atâta timp cât currentNode indică către un nod, fiecare nod din arbore trebuie traversat. Pentru a face acest lucru, repetați pașii de la 4 la 8.
Să definim o metodă care ne va permite să găsim o anumită valoare în arbore. Pentru a folosi oricare dintre metodele de traversare a arborelui, am setat contains(callback, traversal) pentru a lua două argumente: datele pe care le căutăm și tipul de traversare:
Tree.prototype.contains = function(callback, traversal) ( traversal.call(this, callback); );
În corpul conținutului (callback, traversal) folosim o metodă numită call pentru a transmite acest lucru și callback. Primul argument asociază traversarea cu arborele pentru care se apelează (callback, traversal); al doilea argument este o funcție care este apelată pe fiecare nod din arbore.
Imaginați-vă că vrem să trimitem în consolă toate nodurile care conțin date cu numere impar și să traversăm fiecare nod din arbore folosind metoda BFS. Pentru a face acest lucru, trebuie să scrieți următorul cod:
// un arbore este un exemplu de nod rădăcină tree.contains(function(node)( if (node.data === "două") ( console.log(node); ) ), tree.traverseBF);
Metoda add(date, toData, traversal)Acum avem o metodă de a găsi un nod în arbore. Să definim o metodă care ne va permite să adăugăm un nod la un anumit nod:
Tree.prototype.add = function(data, toData, traversal) ( var child = new Node(data), parent = null, callback = function(node) ( if (node.data === toData) ( parent = nod; ) ); this.contains(callback, traversal); if (parent) (parent.children.push(child); child.parent = părinte; ) else (throw new Error("Nu se poate adăuga un nod la un părinte inexistent. "); ));
add(data, toData, traversal) definește trei parametri. datele sunt folosite pentru a crea o nouă instanță de nod. toData - folosit pentru a compara fiecare nod din arbore. Al treilea parametru, traversarea, este tipul de traversare a arborilor utilizat în această metodă.
În corpul add(data, toData, traversal) declarăm trei variabile. Prima variabilă, child , este inițializată ca o nouă instanță Node. A doua variabilă, părinte, este inițializată la null; dar mai târziu va indica orice nod din arbore care se potrivește cu valoarea toData. Realocarea părintelui este efectuată în a treia variabilă - callback.
callback este o funcție care compară toData cu proprietatea de date a fiecărui nod. Dacă un nod îndeplinește condiția instrucțiunii if, este atribuit ca părinte.
Comparația reală a fiecărui nod cu toData se realizează în add(data, toData, traversal) . Tipul de traversare și apel invers trebuie să fie transmise ca argumente pentru add(data, toData, traversal) .
Dacă parent nu există în arbore, punem child în parent.children ; de asemenea, atribuim elementul părinte copilului ca părinte, altfel se aruncă o eroare.
Să folosim add(data, toData, traversal) în exemplul nostru:
var tree = arbore nou ("CEO"); tree.add("VP al Fericirii", "CEO", tree.traverseBF); /* arborele nostru „CEO” └── „VP al Fericirii” */
Iată un exemplu mai complex de utilizare a add(data, toData, traversal):
var tree = arbore nou ("CEO"); tree.add("VP al Fericirii", "CEO", tree.traverseBF); tree.add("VP de Finanțe", "CEO", tree.traverseBF); tree.add("VP of Sadness", "CEO", tree.traverseBF); tree.add(„Director de căței”, „VP de finanțe”, tree.traverseBF); tree.add("Manager de catei", "Director de catei", tree.traverseBF); /* arbore „CEO” ├── „VP al Fericirii” ├── „VP al Finanțelor” │ ├── „Directorul Puppiilor” │ └── „Managerul Cățeilor” └── „VP al Tristeței”
Eliminare metoda (date, dinData, traversare)Pentru a implementa pe deplin Tree, trebuie să adăugăm o metodă numită remove(data, fromData, traversal) . Similar cu eliminarea unui nod din DOM, această metodă va elimina nodul și toate nodurile sale secundare:
Tree.prototype.remove = function(data, fromData, traversal) ( var tree = this, parent = null, childToRemove = null, index; var callback = function(node) ( if (node.data === fromData) (parent = node; this.contains(callback, traversal) (index = findIndex(parent.children, data); if (index === undefined) (throw new Error("Nod to remove); există."); ) else ( childToRemove = parent.children.splice(index, 1); ) ) else ( throw new Error("Părintele nu există."); ) return childToRemove; );
La fel ca add(data, toData, traversal) , metoda remove traversează întregul arbore pentru a găsi nodul care conține al doilea argument, în prezent egal cu fromData . Dacă acest nod este găsit, atunci părintele indică el în prima instrucțiune if.
Potrivit DOM:
- Întregul document este reprezentat de un nod de document;
- Fiecare tag HTML este un nod element;
- Textul din elementele HTML este reprezentat prin noduri de text;
- Fiecare atribut HTML are un nod de atribut corespunzător;
- Comentariile sunt noduri de comentarii.
document HTML
Titlu
Doar text
Exemplul 6.2
În acest exemplu, nodul rădăcină este eticheta. Toate celelalte noduri sunt conținute în interior. Acest nod are două noduri copil: și . Un nod conține un nod, iar un nod conține noduri și
Ar trebui să acordați o atenție deosebită faptului că textul situat în nodul element corespunde nodului text. În exemplul de document HTML, nodul element conține nodul text „HTML Document”, adică „HTML Document” nu este valoarea elementului. Cu toate acestea, în cadrul DOM HTML, valoarea unui nod text poate fi accesată prin proprietatea innerHTML.
Toate nodurile dintr-un document HTML pot fi accesate printr-un arbore, conținutul lor poate fi modificat sau șters și pot fi adăugate elemente noi.
Toate nodurile arborelui sunt în relații ierarhice între ele. Termenii folosiți pentru a descrie aceste relații sunt mamă, element copilŞi descendent. Nodurile părinte au noduri copil, iar copiii de același nivel sunt numiți copii (frați).
Următoarele principii se aplică nodurilor arborelui:
- Nodul cel mai de sus al arborelui se numește rădăcină;
- Fiecare nod, cu excepția nodului rădăcină, are exact un nod părinte;
- Un nod poate avea orice număr de noduri copii;
- Nodul frunză al unui arbore nu are noduri copil;
- Descendenții au un părinte comun.
HTML DOM API
În cadrul DOM, modelele HTML pot fi gândite ca un set de noduri obiecte. Ele pot fi accesate folosind JavaScript sau alte limbaje de programare. Interfața de programare DOM include un set de standarde proprietățiŞi metode.
Proprietăți reprezintă unele entități (de exemplu) și metode- acțiuni asupra lor (de exemplu, add ).
Proprietățile DOM tipice includ următoarele:
- x.innerHTML – valoarea text internă a elementului HTML x;
- x. nodeName – nume x;
- x.nodeValue – valoarea lui x;
- x.parentNode – nod părinte pentru x ;
- x.childNodes – nod copil pentru x ;
- x.atribute – x noduri de atribut.
Obiectul nod corespunzător elementului HTML acceptă următoarele metode:
- x.getElementById(id) – obține elementul cu id-ul specificat;
- x.getElementsByTagName(name) – obțineți toate elementele cu numele etichetei specificate (nume);
- x.appendChild(node) – introduceți un nod copil pentru x ;
- x.removeChild(node) – eliminați un nod copil pentru x.
Pentru a obține text dintr-un element
Cu valoarea atributului id „demo” într-un document HTML, puteți utiliza următorul cod:
txt = document.getElementById(„demo”).innerHTML
Același rezultat poate fi obținut în alt mod:
txt=document.getElementById(„demo”).childNodes.nodeValue
În cadrul DOM, există 3 moduri de a accesa nodurile:
- Folosind metoda getElementById(ID). Aceasta returnează elementul cu ID-ul specificat.
- Folosind metoda getElementsByTagName(nume). Aceasta returnează toate nodurile cu numele etichetei specificate (ca o listă indexată). Primul element din listă are indice zero.
- Prin deplasarea printr-un arbore folosind relații dintre noduri.
- parentNode;
- primulCopil;
- ultimulCopil.
- document.documentElement – pentru a accesa nodul rădăcină al documentului;
- document.body – pentru a accesa eticheta.
- nodeName;
- nodeValue ;
- nodeType.
- Proprietatea nodeName este doar pentru citire;
- Proprietatea nodeName a unui nod element se potrivește exact cu tagname-ul;
- Proprietatea nodeName a unui nod de atribut corespunde numelui atributului;
- Proprietatea nodeName a unui nod text este întotdeauna #text
- Proprietatea nodeName a unui nod de document este întotdeauna #document
- Proprietatea nodeValue a unui nod element nu este definită;
- Proprietatea nodeValue a unui nod text indică textul însuși;
- Proprietatea nodeValue a unui nod de atribut indică valoarea atributului.
- Alerta. Folosit pentru a notifica utilizatorul folosind un browser web.
- Confirma. Folosit pentru a permite utilizatorului să selecteze una dintre cele două opțiuni de răspuns „Da/Nu”. În consecință, Confirmare returnează adevărat/fals.
- Prompt. Folosit pentru introducerea valorii de către utilizator. Când faceți clic pe „OK”, valoarea introdusă este returnată, în cazul „Anulare” valoarea este returnată nulă.
Pentru
- și căci nu va exista nici o frăție 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ă: pt
- va fi
Pentru
- , Pentru - .
API-ul DOM nu este deosebit de complex, dar înainte de a discuta despre programare cu DOM, există câteva probleme de arhitectură DOM de înțeles.
Reprezentarea documentelor ca arbori
Documentele HTML au o structură ierarhică, reprezentată în DOM sub formă de arbore. Nodurile de arbore reprezintă diferite tipuri de conținut de document. În primul rând, vizualizarea arborescentă a unui document HTML conține noduri reprezentând elemente sau etichete precum și
Și noduri reprezentând linii de text. Un document HTML poate conține și noduri reprezentând comentarii HTML.1 Luați în considerare următoarele
un simplu document HTML.
Exemplu de document
Un document HTMLAcesta este un simplu document.
Pentru cei care nu sunt încă familiarizați cu structurile arborescente în programarea computerelor, este util să știe că împrumută terminologia din arborii genealogici. Nodul situat direct deasupra unui nod dat este numit părintele acelui nod. Nodurile care sunt la un nivel sub alt nod sunt copii ale acelui nod.
Nodurile care sunt la același nivel și au același părinte se numesc frați. Noduri situate la orice
numărul de niveluri de sub alt nod sunt copiii acestuia. Părinte, bunicul și orice alte noduri situate deasupra unui nod dat sunt strămoșii acestuia.
Noduri
Structura arborelui DOM este un arbore de obiecte Node de diferite tipuri. Interfața Node1 definește proprietăți și metode pentru navigarea și manipularea arborelui. Proprietatea childNodes a unui obiect Node returnează o listă de noduri copil, proprietățile firstChild, lastChild, nextSibling, previousSibling și parentNode oferă o modalitate de a traversa nodurile arborelui. Metode precum appendChild(), removeChild(), replaceChild() și insertBefore() vă permit să adăugați noduri în arborele documentului și să le eliminați.
Tipuri de noduri
Tipurile de noduri din arborele de documente sunt reprezentate de subinterfețe speciale ale interfeței Node. Orice obiect Node are o proprietate nodeType care determină tipul nodului. Dacă proprietatea nodeType a unui nod este egală, de exemplu, cu constanta Node.ELEMENT_NODE, atunci obiectul Node este, de asemenea, un obiect Element și puteți utiliza toate metodele și proprietățile definite de interfața Element cu acesta.
Proprietatea document-Element a acestui obiect se referă la un obiect Element care reprezintă elementul rădăcină al documentului. Pentru documentele HTML, aceasta este o etichetă care este prezentă în mod explicit sau implicit în document. (Pe lângă elementul rădăcină, un nod Document poate avea și alte elemente copil, cum ar fi obiecte Comment.)
Cea mai mare parte a arborelui DOM constă din obiecte Element reprezentând etichete precum și și obiecte Text care reprezintă linii de text. Dacă analizatorul de documente stochează comentarii, aceste comentarii sunt reprezentate în arbore ca obiecte Comentariu DOM.
Atribute
Atributele elementului (de exemplu, atributele src și width ale unei etichete ) poate fi citit, setat și eliminat folosind metodele getAttribute(), set-Attribute() și removeAttribute() ale interfeței Element.
Altele, mai puțin mod convenabil lucrul cu atribute este metoda getAttribute-Node(), care returnează un obiect Attr reprezentând atributul și valoarea acestuia. (Un motiv pentru alegerea acestei tehnologii mai puțin convenabile este că interfața Attr are o proprietate specificată, care vă permite să determinați dacă un anumit atribut este specificat în mod explicit în document sau are o valoare implicită.) Rețineți, totuși, că obiectele Attr nu sunt prezente în matricea childNodes a elementului și nu fac parte direct din arborele documentului, cum ar fi nodurile Element și Text.
Specificația DOM permite accesarea nodurilor Attr prin intermediul matricei de atribute a interfeței Node, dar Microsoft Internet Explorer definește o matrice de atribute diferită, incompatibilă, ceea ce face imposibilă utilizarea acestei matrice într-o manieră portabilă.
API HTML DOM
Standardul DOM este proiectat să funcționeze atât cu XML, cât și cu HTML. API-ul DOM de bază — Nodul, Elementul, Documentul și alte interfețe — este relativ universal și se aplică ambelor tipuri de documente. Standardul DOM include și interfețe specifice documentelor HTML. HTMLDocument este o subinterfață specifică HTML a interfeței Document, iar HTMLElement este o subinterfață specifică HTML a interfeței Element. În plus, DOM definește interfețe specifice etichetelor pentru multe elemente HTML. Aceste interfețe, cum ar fi HTMLBodyElement și HTMLTitleElement, definesc de obicei un set de proprietăți care reflectă atributele unei etichete HTML date. Interfața HTMLDocument definește diverse proprietăți și metode ale documentului care au fost acceptate de browsere înainte de standardul W3C. Acestea includ proprietatea locație, matricea de formulare și metoda write().
Interfața HTMLElement definește proprietățile id, style, title, lang, dir și className, care oferă acces convenabil la valorile atributelor id, style, title, lang, dir și class care pot fi utilizate cu toate HTML. etichete.
Etichetele HTML nu acceptă alte atribute decât cele șase listate și, prin urmare, sunt reprezentate în întregime de interfața HTMLElement.
Pentru toate celelalte etichete HTML din partea specificației DOM referitoare la
la HTML, sunt definite interfețe speciale. Pentru multe etichete HTML
aceste interfețe nu fac altceva decât să ofere un set de proprietăți corespunzătoare atributelor HTML. De exemplu, tegu
- există o interfață HTMLU ListElement corespunzătoare, iar eticheta are o interfață HTMLBodyElement corespunzătoare. Deoarece aceste interfețe definesc pur și simplu proprietăți care sunt standardizate în HTML, ele nu sunt documentate în detaliu în această carte.
Puteți presupune cu siguranță că obiectul HTMLElement care reprezintă o anumită etichetă HTML are proprietăți pentru fiecare dintre atributele standard ale acelei etichete (consultați convențiile de denumire în secțiunea următoare). Rețineți că standardul DOM definește proprietăți pentru atributele HTML pentru confortul scriitorilor de scripturi. O modalitate comună (și poate preferată) de a citi și a seta valorile atributelor este oferită de metodele getAttribute() și setAttribute() ale obiectului Element. Unele dintre interfețele descrise în DOM HTML definesc proprietăți sau metode suplimentare, altele decât cele corespunzătoare valorilor atributelor HTML. De exemplu, interfața HTMLInputElement definește metodele focus() și blur(), iar interfața HTMLFormElement definește metodele submit() și reset() și proprietatea length. Astfel de metode și proprietăți au fost în general prezente înainte de standardizarea DOM și au fost făcute parte din standardul de compatibilitate cu practica de programare acceptată. Astfel de interfețe sunt documentate în Referința W3C DOM (Partea V). În plus, informații despre porțiunile de „cele mai bune practici” ale acestor interfețe pot fi găsite în partea a IV-a a Referinței JavaScript pentru client, deși aceste informații sunt adesea enumerate sub numele folosit înainte de standardizarea DOM, cum ar fi HTMLFormElement și HTMLInputElement în Referința pentru JavaScript pe partea clientului” sunt descrise în secțiunile „Formular” și „Introducere”.
Convenții de denumire pentru HTML
Când lucrați cu părți specifice HTML ale standardului DOM, trebuie să aveți în vedere câteva convenții simple de denumire. Numele proprietăților specifice interfeței HTML încep cu litere mici. Dacă numele proprietății constă din mai mult de un cuvânt, primele litere ale celui de-al doilea și ale cuvintelor următoare sunt scrise cu majuscule. Astfel, atributul maxlength al etichetei este tradus în proprietatea maxLength a interfeței HTMLInputElement.
Când numele unui atribut HTML intră în conflict cu un cuvânt cheie JavaScript, numele este prefixat cu „html” pentru a rezolva conflictul. De exemplu, atributul for al unei etichete este tradus în proprietatea htmlFor a interfeței HTMLLabelElement. Excepția de la această regulă este atributul class (care poate fi specificat pentru orice element HTML) - este tradus în proprietatea className1 a interfeței HTMLElement.
Niveluri și capabilități DOM
Există două versiuni, sau două „nivele”, ale standardului DOM. Nivelul 1 DOM a fost standardizat în octombrie 1998. Acesta definește interfețele de bază DOM, cum ar fi Node, Element, Attr și Document, precum și diverse interfețe specifice HTML. Nivelul 2 DOM a fost standardizat în noiembrie 2000.2 Pe lângă unele modificări aduse interfețelor de bază, această versiune a DOM a fost extinsă foarte mult prin definirea API-urilor standard pentru lucrul cu evenimente de document și foi de stil în cascadă (CSS), precum și prin furnizarea de instrumente suplimentare pentru lucrul cu zone continue de documente. În momentul scrierii acestui articol, Grupul de lucru DOM de la W3C standardizează la nivelul DOM 3. În plus, este posibil să vedeți ocazional referințe la nivelul DOM 0. Acest termen nu se referă la niciun standard formal, dar servește ca referință informală la modelul obiect comun. document de facilități implementat în Netscape și Internet Explorer înainte de standardizarea de către consorțiul W3C. Cu DOM Level 2, standardul a devenit modular. Modulul de bază, care definește structura arborescentă de bază a unui document folosind (printre altele) interfețele Document, Node, Element și Next, este singurul modul necesar. Toate celelalte module sunt opționale și pot fi sau nu acceptate, în funcție de implementare. Implementarea DOM a unui browser web trebuie să accepte modulul HTML, deoarece documentele web sunt scrise în HTML. Browserele care acceptă foi de stil CSS acceptă de obicei modulele StyleSheets și CSS, deoarece stilurile CSS joacă un rol cheie în programarea HTML dinamică. De asemenea, deoarece majoritatea programelor JavaScript interesante necesită gestionarea evenimentelor, ne putem aștepta ca browserele web să accepte modulul Evenimente din specificația DOM.
Din păcate, modulul Evenimente a fost definit doar recent de specificația DOM Level 2 și nu a fost acceptat pe scară largă la momentul scrierii acestui articol.
Conformitatea DOM
La momentul scrierii acestui articol, nu există niciun browser care să respecte pe deplin standardul DOM. Lansările recente ale Mozilla s-au apropiat cel mai mult de acest lucru, iar compatibilitatea completă cu DOM Nivelul 2 este un obiectiv al proiectului Mozilla. Browserul Netscape 6.1 respectă majoritatea modulelor importante de Nivel 2, în timp ce Netscape 6.0 are o compatibilitate destul de bună, dar cu unele lacune. Internrt Explorer 6 este în mare parte compatibil (cu cel puțin o excepție nefericită) cu DOM Nivelul 1, dar nu acceptă multe module de Nivelul 2, în special modulul Evenimente. Internet Explorer 5 și 5.5 au lacune semnificative de compatibilitate, dar acceptă metode cheie de nivel 1 DOM suficient de bine pentru a rula majoritatea exemplelor din acest capitol. Versiunea pentru Macintosh a IE are suport DOM mult mai cuprinzător decât IE 5 pentru Windows. Pe lângă Mozilla, Netscape, Internet Explorer și alte câteva browsere oferă suport cel puțin parțial DOM. Numărul de browsere disponibile a devenit prea mare, iar schimbările în suportul standardelor au loc prea repede, pentru ca această carte să încerce să precizeze definitiv ce caracteristici DOM acceptă un anumit browser. Prin urmare, va trebui să vă bazați pe alte surse de informații pentru a determina compatibilitatea implementării DOM în orice browser dat. O sursă de informații despre compatibilitate este implementarea în sine. Într-o implementare conformă, proprietatea de implementare a obiectului Document se referă la un obiect DOMImplementation care definește o metodă numită hasFeature(). Această metodă (dacă există) poate fi utilizată pentru a obține informații despre dacă un anumit modul standard DOM (sau caracteristici) este acceptat. De exemplu, puteți determina dacă implementarea DOM a unui browser web acceptă interfețele de bază DOM de nivel 1 pentru lucrul cu documente HTML folosind următorul cod:
Dacă (document.implementation &&
document.implementation.hasFeature &&
document.implementation.hasFeature("html", "1.0")) (
// Browserul pretinde că acceptă interfețele de bază de Nivel 1
// și interfețe HTML
}
Metoda hasFeature() are două argumente: primul este numele modulului care este verificat, iar al doilea este numărul versiunii sub formă de șir. Returnează true dacă versiunea specificată a modulului specificat este acceptată.
De exemplu, dacă hasFeature() indică faptul că modulul MouseEvents este acceptat, aceasta înseamnă că este acceptat și modulul UIEvents, ceea ce implică, la rândul său, suport pentru modulele Evenimente, Vizualizări și Core În Internet Explorer 6 (pe Windows), hasFeature () returnează adevărat numai pentru modulul „HTML” și versiunea „1.0”. Nu raportează compatibilitatea cu alte module
În Netscape 6.1, hasFeature() returnează true pentru majoritatea numelor de module și numerelor de versiune, cu excepția modulelor Traversal și Mutation-Events. Metoda returnează false pentru modulele Core și CSS2 versiunea 2.0, indicând compatibilitate incompletă (chiar dacă suportul pentru aceste module este foarte bun).
Această carte documentează interfețele care compun toate modulele DOM. Modulele Core, HTML, Traversal și Range sunt acoperite în acest capitol. Modulele StyleSheets, CSS și CSS2 sunt acoperite în Capitolul 18, iar diferitele module legate de evenimente (cu excepția MutationEvents) sunt tratate în Capitolul 19. Partea V, Referința W3C DOM, conține o descriere completă a tuturor modulelor.
Metoda hasFeature() nu este complet de încredere. După cum sa menționat mai sus, IE 6 raportează compatibilitatea de Nivel 1 cu instrumentele HTML, chiar dacă există unele probleme de compatibilitate. Pe de altă parte, Netscape 6.1 raportează incompatibilitate cu Level 2 Core, chiar dacă acest browser este aproape compatibil cu acest modul. În ambele cazuri, sunt necesare informații mai detaliate despre ce anume este compatibil și ce nu este. Dar volumul acestor informații este prea mare și prea variabil pentru a fi inclus într-o publicație tipărită.
Cei care sunt activi în dezvoltarea web, fără îndoială, știu deja sau vor afla în curând despre multe detalii de compatibilitate specifice browserului. Există și resurse pe Internet care pot fi de ajutor. Cel mai important, W3C (în colaborare cu Institutul Național de Standarde și Tehnologie din SUA) lucrează la crearea unui set de instrumente open source pentru testarea implementărilor DOM. Pe
În momentul scrierii acestui articol, dezvoltarea suitei de teste este abia la început, dar ar trebui să ofere un mijloc neprețuit de testare fină a compatibilității implementării DOM. Detalii pot fi găsite la http://www.w3c.org/DOM/Test/.
Organizația Mozilla are mai multe suite de testare pentru diferite standarde, inclusiv DOM Level 1 (disponibil la http://www.mozilla.org/qualitybrowser_sc.html). Netscape a publicat o suită de teste care include câteva teste pentru DOM Level 2 (disponibilă la http://developer.netscape.com/evangelism/tools/testsuites/). Netscape a publicat, de asemenea, o comparație părtinitoare (și depășită) a compatibilității DOM a versiunilor Mozilla timpurii și IE 5.5 (disponibilă la http://home.netscape.com/browsers/future/standards.html). În cele din urmă, puteți găsi și informații de compatibilitate și conformitate pe site-uri independente de pe Internet. Un site demn de menționat este publicat de Peter-Paul Koch. Un link către tabelul de compatibilitate DOM poate fi găsit pe pagina principală JavaScript (http://www.xs4all.nl/~ppk/js/).
Compatibilitate cu Internet Explorer DOM
Întrucât IE este cel mai utilizat browser web, câteva note speciale despre compatibilitatea sa cu specificațiile DOM sunt necesare aici. IE 5 și versiunile ulterioare acceptă funcțiile de bază de nivel 1 și HTML suficient de bine pentru a rula exemplele din acest capitol și acceptă funcțiile cheie CSS de nivel 2 suficient de bine pentru a rula majoritatea exemplelor8. Din păcate, IE 5, 5.5 și 6 nu acceptă modulul Evenimente de la DOM Level 2, chiar dacă Microsoft a fost implicat în definirea acestui modul și a avut suficient timp pentru a-l implementa în IE 6. După cum vom vedea în capitolul 19, procesarea evenimentelor joacă un rol cheie în JavaScript la nivel de client, iar lipsa de suport din partea IE pentru un model standard de gestionare a evenimentelor face dificilă dezvoltarea aplicațiilor web bogate la nivelul clientului. Deși IE 6 pretinde (prin metoda hasFeature()) că acceptă interfețele de bază DOM Level 1 și HTML, de fapt, acest suport nu este complet. Cea mai flagrantă problemă pe care probabil o veți întâlni este una mică, dar enervantă: IE nu acceptă constante de tip nod definite în interfața Node. Amintiți-vă că fiecare nod dintr-un document are o proprietate nodeType care specifică tipul nodului respectiv. Specificația DOM afirmă, de asemenea, că interfața Node definește constante care reprezintă fiecare dintre tipurile de noduri pe care le definește. De exemplu, constanta Node.ELEMENT_NODE reprezintă un nod Element. În IE (cel puțin până la versiunea 6 inclusiv) aceste constante pur și simplu nu există.
Exemplele din acest capitol au fost modificate pentru a evita acest obstacol și conțin literali întregi în loc de constantele simbolice corespunzătoare.
De exemplu:
dacă (n.nodeType == 1 /*Node.ELEMENT_NODE*/)
// Verificați dacă n este un obiect Element
Un stil de programare bun necesită ca constantele să fie plasate în cod, mai degrabă decât literalele întregi codificate, iar cei care doresc să facă codul portabil pot include următorul cod în program pentru a defini constantele dacă acestea lipsesc:
Dacă (!window.Node) (
var Node = ( // Dacă nu există niciun obiect Node, definiți
ELEMENT_NODE: 1, // acesta cu următoarele proprietăți și valori.
ATTRIBUTE_NODE: 2, // Rețineți că acestea sunt numai tipuri de noduri
TEXT_NODE: 3, // HTML. Pentru nodurile XML trebuie să definiți
COMMENT_NODE: 8, // alte constante aici.
DOCUMENT_NODE: 9,
DOCUMENT_FRAGMENT_NODE: 11
}
}
Interfețe DOM independente de limbă
Deși standardul DOM a luat naștere din dorința de a avea un API comun pentru programarea HTML dinamic, DOM nu este de interes doar pentru programatorii web. De fapt, standardul este acum cel mai mult utilizat de programele de server Java și C++ pentru analizarea și manipularea documentelor XML. Datorită numeroaselor sale cazuri de utilizare, standardul DOM a fost definit ca fiind independent de limbă. Această carte acoperă doar legarea API-ului DOM la JavaScript, dar mai sunt câteva lucruri de reținut. În primul rând, rețineți că proprietățile obiectului din legăturile JavaScript corespund de obicei cu perechea metodei get/set în alte limbi. Prin urmare, atunci când un programator Java vă întreabă despre metoda getFirstChild() a interfeței Node, trebuie să înțelegeți că în JavaScript legarea API Node nu definește o metodă getFirst-Child(). În schimb, definește pur și simplu proprietatea firstChild, iar citirea acestei proprietăți în JavaScript este echivalentă cu apelarea metodei getFirstChild() în Java. O altă caracteristică importantă a legării API-ului DOM la JavaScript este că unele obiecte DOM se comportă ca matrice JavaScript. Dacă o interfață definește o metodă numită item(), obiectele care implementează acea interfață se comportă la fel ca și matrice de doar citire cu un index numeric. Să presupunem că, în urma citirii proprietății childNodes a unui nod, se obține un obiect NodeList. Obiectele Node individuale dintr-o listă pot fi obținute, în primul rând, prin trecerea numărului nodului dorit la metoda item() și, în al doilea rând, prin tratarea obiectului NodeList ca pe o matrice și accesarea acestuia prin index. Următorul cod ilustrează aceste două posibilități:
Var n = document.documentElement; // Acesta este un obiect Node.
var copii = n.childNodes; // Acesta este un obiect NodeList.
var head = children.item(0); // Acesta este un singur mod
// folosiți NodeList.
var body = copii; // Dar există o cale mai ușoară!
De asemenea, dacă un obiect DOM are o metodă namedItem(), transmiterea unui șir la acea metodă este la fel cu utilizarea șirului ca index de matrice. De exemplu, următoarele linii de cod reprezintă modalități echivalente de a accesa un element de formular:
Var f = document.forms.namedItem("myform");
var g = document.forms["myform"];
var h = document.forms.myform;
Standardul DOM poate fi utilizat într-o varietate de moduri, astfel încât dezvoltatorii standardului au definit cu atenție API-ul DOM într-un mod care nu limitează capacitatea altor dezvoltatori de a implementa API-ul. În special, standardul DOM definește interfețe în loc de clase. În programarea orientată pe obiecte, o clasă este un tip de date fix care trebuie implementat exact așa cum este definit. Pe de altă parte, o interfață este o colecție de metode și proprietăți care trebuie implementate împreună. Prin urmare, o implementare DOM poate defini orice clase pe care le consideră potrivite, dar acele clase trebuie să definească metode și proprietăți ale diferitelor interfețe DOM. Această arhitectură are câteva consecințe importante. În primul rând, este posibil ca numele claselor utilizate în implementare să nu corespundă direct cu numele interfeței utilizate în standardul DOM (și în această carte). În al doilea rând, o clasă poate implementa mai mult de o interfață. Luați în considerare, de exemplu, un obiect Document. Acest obiect este o instanță a unei clase definite de implementarea browserului web. Nu știm ce clasă este, dar știm că implementează interfața Document; adică toate metodele și proprietățile definite de interfața Document ne sunt disponibile prin obiectul Document. Deoarece browserele web funcționează cu documente HTML, știm, de asemenea, că obiectul Document implementează interfața
HTMLDocument și că avem și acces la toate metodele și proprietățile definite de această interfață. În plus, dacă browserul web acceptă foi de stil CSS și implementează modulul CSS DOM, obiectul Document implementează și interfețele DocumentStyle și DocumentCSS DOM. Și dacă browserul web acceptă modulele Evenimente și Vizualizări, Document implementează și interfețele DocumentEvent și DocumentView.
DOM-ul este împărțit în module independente, astfel încât definește mai multe interfețe minore suplimentare, cum ar fi DocumentStyle, DocumentEvent și DocumentView, fiecare dintre acestea definind doar una sau două metode. Astfel de interfețe nu sunt niciodată implementate independent de interfața Document de bază și din acest motiv nu le descriu separat. Dacă citiți descrierea interfeței Document în Referința W3C DOM, veți descoperi că aceasta listează și metodele și proprietățile diferitelor interfețe suplimentare. De asemenea, privind descrierea interfețelor suplimentare, veți găsi pur și simplu o referință încrucișată la interfața de bază cu care sunt asociate. Excepția de la această regulă este atunci când interfața suplimentară este complexă. De exemplu, interfața HTMLDocument este întotdeauna implementată de același obiect care implementează interfața Document, dar deoarece HTMLDocument
adaugă o cantitate semnificativă de funcționalități noi, i-am dat propria pagină de manual.
De asemenea, este important să înțelegeți că, deoarece standardul DOM definește interfețe și nu clase, nu definește nicio metodă de constructor. Dacă, de exemplu, doriți să creați un nou obiect Text de inserat într-un document, nu puteți scrie doar:
Var t = text nou ("acesta este un nod text nou"); // Nu există un astfel de constructor!
Standardul DOM nu poate defini constructori, dar definește mai multe metode utile din fabrică în interfața Document pentru crearea de obiecte. Prin urmare, pentru a crea un nou nod Text în document, trebuie să scrieți:
Var t = document.createTextNode("acesta este un nou nod text");
Metodele din fabrică definite în DOM au nume care încep cu cuvântul „crea”. Pe lângă metodele din fabrică definite de interfața Document, mai multe astfel de metode din fabrică sunt definite de interfața DOMImplementation și sunt accesibile prin document.implementation.
Un arbore este una dintre cele mai frecvent utilizate structuri de date în dezvoltarea web. Fiecare dezvoltator web care a scris cod HTML și l-a încărcat în browser a creat un arbore numit Document Object Model (DOM).
De exemplu, articolul pe care îl citiți în prezent este afișat în browser sub formă de arbore. Paragrafele sunt prezentate ca elemente
; elemente
Imbricat într-un ; și este imbricat în element.
Imbricarea datelor este ca un arbore genealogic. Elementul este părinte, este un copil al acestuia, iar elementul este un copil al elementului.
În acest articol, folosim două metode diferite de traversare a arborelui: căutarea în adâncime (DFS) și căutarea în lățime (BFS). Ambele tipuri de traversare implică moduri diferite de interacțiune cu arborele și implică utilizarea structurilor de date pe care le-am acoperit în această serie de articole. DFS folosește o stivă, iar BFS folosește o coadă.
Arborele (adâncimea prima căutare și lățimea prima căutare)În informatică, un arbore este o structură care definește date ierarhice cu noduri. Fiecare nod de arbore conține propriile sale date și pointeri către alte noduri.
Să comparăm arborele cu structura unei organizații. Această structură are o poziție de nivel superior (nodul rădăcină), cum ar fi CEO. Sub această poziție se află și alte funcții, cum ar fi vicepreședinte (VP).
Pentru a reprezenta liniile lor de raportare, folosim săgeți care indică de la CEO la Vicepreședinte. Pozițiile precum CEO sunt noduri; Legăturile pe care le-am subliniat de la CEO la VP sunt indicii. Pentru a crea alte conexiuni în structura noastră organizațională, repetăm acest proces - adăugând pointeri către alte noduri.
Să ne uităm la DOM. DOM conține un element, care este elementul de nivel superior (nodul rădăcină). Acest nod indică elementele și . Acest proces se repetă pentru toate nodurile din DOM.
Unul dintre avantajele acestui design este capacitatea de a cuibări noduri: element
- , de exemplu, poate conține multe elemente
Proprietatea length este utilizată pentru a determina lungimea listei de noduri.
x = document.getElementsByTagName("p");
pentru (i = 0; i< x.length; i++)
document.write(x[i].innerHTML);
document.write("
");
Priser 6.4
În acest exemplu, conținutul text al tuturor elementelor corespunzătoare etichetei este inserat în documentul HTML sub formă de listă.
Pentru a naviga în arborele în imediata apropiere a nodului curent, puteți utiliza următoarele proprietăți:
Pentru a accesa direct etichetele, puteți folosi 2 proprietăți speciale:
Proprietățile nodului
În DOM HTML, fiecare nod este un obiect care poate avea metode (funcții) și proprietăți. Cele mai importante proprietăți sunt următoarele:
Proprietatea nodeName indică numele nodului. Această proprietate are următoarele caracteristici:
Notă: nodeName conține întotdeauna numele etichetei elementului HTML în majuscule.
Proprietatea nodeValue indică valoarea nodului. Această proprietate are următoarele caracteristici:
Proprietatea nodeType returnează tipul nodului. Această proprietate este numai pentru citire:
Cele mai importante tipuri de noduri sunt următoarele:
Schimbarea elementelor HTML
Elementele HTML pot fi modificate folosind JavaScript, HTML DOM și evenimente.
Exemplul 6.5 arată cum conținutul text al unei etichete poate fi modificat dinamic
Salut Lume!
document.getElementById("p1").innerHTML="Text nou!";
Exemplul 6.5.
Elemente de dialog
JavaScript acceptă lucrul cu următoarele elemente de interfață de dialog:
2. Sintaxă:
alert("mesaj");
4. Sintaxă:
confirma ("intrebare");
7. Sintaxă:
prompt("întrebare/interogare","valoare implicită");
Mai jos este codul pentru o pagină web în care utilizatorul are opțiunea de a selecta culoarea textului folosind un element de dialog
// textul va fi afișat aici
Ați selectat culoarea textului: negru
// utilizatorul selectează culoarea textului
var tcolor = prompt("Selectați culoarea textului: roșu, albastru, verde, galben, negru","negru");
// setează text
document.getElementById("c").innerHTML = "Ați selectat culoarea textului: " + tcolor;
// setează culoarea textului
document.getElementById("c").style.color = tcolor;
Î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.
Strămoși și descendențiDupă 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 copilul 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 doar cea anterioară (precedentă) va fi div class = „stânga”, cu următoarea (precedentă) aceeași imagine.
Primul și ultimul copilPrimul copil (first-child) este un element copil care este primul pentru părintele său, ultimul copil (last-child) este, în consecință, 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.