Ano ang pagkakaiba sa pagitan ng ul at ol tag? Ang mga halimbawa ng naka-istilong disenyo ng ul li ay naglilista ng CSS. Mga HTML bullet na listahan - ul at li tag

Paggawa gamit ang modelo ng DOM

Ang bawat bagay sa Window ay may isang pag-aari ng dokumento na tumutukoy sa bagay na Dokumento. Ang object ng Dokumento na ito ay hindi isang standalone na bagay. Ito ang pangunahing bagay ng isang malawak na API na kilala bilang Document Object Model (DOM), na tumutukoy kung paano maa-access ang nilalaman ng dokumento.

Pangkalahatang-ideya ng DOM

Ang Document Object Model (DOM) ay ang pangunahing application programming interface na nagbibigay ng kakayahang magtrabaho kasama ang nilalaman ng HTML at XML na mga dokumento. Ang DOM application programming interface (API) ay hindi partikular na kumplikado, ngunit mayroong maraming mga tampok na arkitektura na dapat mong malaman.

Una, unawain na ang mga nested na elemento sa HTML o XML na mga dokumento ay kinakatawan bilang isang puno ng mga bagay na DOM. Ang tree view ng isang HTML na dokumento ay naglalaman ng mga node na kumakatawan sa mga elemento o tag, gaya ng at

At mga node na kumakatawan sa mga linya ng teksto. Ang isang HTML na dokumento ay maaari ding maglaman ng mga node na kumakatawan sa mga komento sa HTML. Isaalang-alang ang sumusunod na simpleng HTML na dokumento:

Halimbawang Dokumento Ito ay isang HTML na dokumento

Halimbawa simple lang text.

Ang representasyon ng DOM ng dokumentong ito ay ipinapakita sa sumusunod na diagram:

Para sa mga hindi pamilyar sa mga istruktura ng puno sa computer programming, makatutulong na malaman na ang terminolohiya para sa paglalarawan sa mga ito ay hiniram mula sa mga puno ng pamilya. Ang node na matatagpuan mismo sa itaas ng node na ito ay tinatawag magulang kaugnay ng node na ito. Ang mga node na matatagpuan sa isang antas sa ibaba ng isa pang node ay mga subsidiary kaugnay ng node na ito. Ang mga node na nasa parehong antas at may parehong magulang ay tinatawag kapatid na babae. Ang mga node na matatagpuan sa anumang bilang ng mga antas sa ibaba ng isa pang node ay ang mga anak nito. Ang magulang, lolo't lola, at anumang iba pang mga node sa itaas ng isang ibinigay na node ay ang mga ninuno nito.

Ang bawat parihaba sa diagram na ito ay isang document node, na kinakatawan ng isang Node object. Tandaan na ang figure ay nagpapakita ng tatlong magkakaibang uri ng mga node. Ang ugat ng puno ay ang Document node, na kumakatawan sa buong dokumento. Ang mga node na kumakatawan sa mga elemento ng HTML ay mga node ng uri ng Element, at ang mga node na kumakatawan sa text ay mga node ng uri ng Text. Ang Dokumento, Elemento at Teksto ay mga subclass ng klase ng Node. Ang Dokumento at Elemento ay ang dalawang pinakamahalagang klase sa DOM.

Ang uri ng Node at ang mga subtype nito ay bumubuo sa uri ng hierarchy na ipinapakita sa diagram sa ibaba. Tandaan ang mga pormal na pagkakaiba sa pagitan ng mga generic na uri ng Document at Element, at ang mga uri ng HTMLDocument at HTMLElement. Ang uri ng Dokumento ay kumakatawan sa isang HTML at XML na dokumento, at ang klase ng Elemento ay kumakatawan sa isang elemento ng dokumentong iyon. Ang mga subclass ng HTMLDocument at HTMLElement ay partikular na kumakatawan sa isang HTML na dokumento at mga elemento nito:

Ang isa pang dapat tandaan sa diagram na ito ay mayroong malaking bilang ng mga subtype ng klase ng HTMLElement na kumakatawan sa mga partikular na uri ng mga elemento ng HTML. Ang bawat isa sa kanila ay tumutukoy sa mga katangian ng JavaScript na nagpapakita ng mga katangian ng HTML ng isang partikular na elemento o pangkat ng mga elemento. Ang ilan sa mga partikular na klase na ito ay tumutukoy sa mga karagdagang katangian o pamamaraan na hindi nagpapakita ng HTML markup language syntax.

Pagpili ng mga elemento ng dokumento

Ang gawain ng karamihan sa mga programa ng kliyente sa wikang JavaScript ay kahit papaano ay nauugnay sa pagmamanipula ng mga elemento ng dokumento. Sa runtime, maaaring gamitin ng mga program na ito ang global variable na dokumento, na tumutukoy sa isang Document object. Gayunpaman, upang maisagawa ang anumang pagmamanipula sa mga elemento ng dokumento, dapat makuha ng program, o piliin, ang mga bagay na Elemento na tumutukoy sa mga elemento ng dokumentong iyon. Tinutukoy ng DOM ang ilang paraan upang pumili ng mga elemento. Maaari kang pumili ng elemento o elemento ng isang dokumento:

    sa pamamagitan ng halaga ng id attribute;

    sa pamamagitan ng halaga ng katangian ng pangalan;

    sa pamamagitan ng pangalan ng tag;

    sa pamamagitan ng CSS klase o pangalan ng mga klase;

    sa pamamagitan ng pagtutugma ng isang partikular na tagapili ng CSS.

Ang lahat ng mga diskarte sa pag-sample ng elemento ay inilarawan sa mga sumusunod na subsection.

Pagpili ng mga elemento ayon sa halaga ng katangian ng id

Ang lahat ng mga elemento ng HTML ay may mga katangian ng id. Ang halaga ng attribute na ito ay dapat na natatangi sa loob ng isang dokumento—walang dalawang elemento sa parehong dokumento ang dapat magkaroon ng parehong id attribute value. Maaari kang pumili ng isang elemento sa pamamagitan ng isang natatanging halaga ng katangian ng id gamit ang getElementById() na pamamaraan ng object na Dokumento:

Var section1 = document.getElementById("section1");

Ito ang pinakasimple at pinakakaraniwang paraan upang pumili ng mga elemento. Kung kailangang magawa ng iyong script na manipulahin ang isang partikular na hanay ng mga elemento ng dokumento, magtalaga ng mga halaga sa mga katangian ng id ng mga elementong iyon at gamitin ang kakayahang hanapin ang mga ito gamit ang mga halagang iyon.

Sa mga bersyon ng Internet Explorer na mas maaga kaysa sa IE8, ang getElementById() method ay naghahanap ng mga value ng attribute ng id sa isang case-insensitive na paraan at nagbabalik din ng mga elementong tumutugma sa value ng attribute ng pangalan.

Pagpili ng mga elemento ayon sa halaga ng katangian ng pangalan

Ang pangalang HTML attribute ay orihinal na inilaan upang pangalanan ang mga elemento ng form, at ang halaga ng katangiang ito ay ginamit kapag ang data ng form ay isinumite sa server. Tulad ng id attribute, ang name attribute ay nagtatalaga ng pangalan sa elemento. Gayunpaman, hindi tulad ng id, ang halaga ng katangian ng pangalan ay hindi kailangang maging natatangi: maraming elemento ang maaaring magkaroon ng parehong pangalan, na medyo karaniwan kapag ginamit sa mga anyo ng mga radio button at checkbox. Bukod pa rito, hindi tulad ng id, pinapayagan lang ang attribute ng pangalan sa ilang partikular na elemento ng HTML, kabilang ang mga form, elemento ng form, at .

Maaari kang pumili ng mga elemento ng HTML batay sa mga halaga ng kanilang mga katangian ng pangalan gamit ang getElementsByName() na paraan ng object ng Dokumento:

Var radiobuttons = document.getElementsByName("paborito_kulay");

Ang getElementsByName() na pamamaraan ay hindi tinukoy ng klase ng Dokumento, ngunit ng klase ng HTMLDocument, kaya available lang ito sa mga HTML na dokumento at hindi available sa mga XML na dokumento. Nagbabalik ito ng NodeList object, na kumikilos tulad ng read-only na array ng mga Element object.

Sa IE, ang getElementsByName() na pamamaraan ay nagbabalik din ng mga elemento na ang halaga ng katangian ng id ay tumutugma sa tinukoy na halaga. Upang matiyak ang pagiging tugma ng cross-browser, dapat kang maging maingat sa pagpili ng mga halaga ng katangian at huwag gumamit ng parehong mga string tulad ng mga halaga para sa mga katangian ng pangalan at id.

Pumili ng mga item ayon sa uri

Ang getElementsByTagName() na paraan ng Document object ay nagbibigay-daan sa iyong piliin ang lahat ng HTML o XML na elemento ng isang tinukoy na uri (o ayon sa pangalan ng tag). Halimbawa, maaari kang makakuha ng read-only array-like object na naglalaman ng mga Element object ng lahat ng elemento sa dokumento tulad nito:

Var spans = document.getElementsByTagName("span");

Katulad ng getElementsByName() method, ang getElementsByTagName() ay nagbabalik ng NodeList object. Ang mga elemento ng dokumento ay kasama sa NodeList array sa parehong pagkakasunud-sunod kung saan lumilitaw ang mga ito sa dokumento, i.e. unang elemento

Sa dokumento maaari kang pumili:

Var firstParagraph = document.getElementsByTagName("p");

Hindi case sensitive ang mga pangalan ng HTML tag, at kapag inilapat ang getElementsByTagName() sa isang HTML na dokumento, nagsasagawa ito ng case-insensitive na paghahambing laban sa pangalan ng tag. Ang spans variable na ginawa sa itaas, halimbawa, ay isasama rin ang lahat ng elemento na nakasulat bilang .

Maaari kang makakuha ng NodeList na naglalaman ng lahat ng elemento ng isang dokumento sa pamamagitan ng pagpasa ng wildcard na character na "*" sa getElementsByTagName() na pamamaraan.

Bilang karagdagan, tinutukoy din ng klase ng Elemento ang getElementsByTagName() na pamamaraan. Ito ay gumaganap nang eksakto tulad ng bersyon ng klase ng Dokumento ng pamamaraan, ngunit pinipili lamang ang mga elemento na nagmula sa elemento kung saan tinawag ang pamamaraan. Iyon ay, hanapin ang lahat ng mga elemento sa loob ng unang elemento

Magagawa mo ito sa ganitong paraan:

Var firstParagraph = document.getElementsByTagName("p"); var firstParagraphSpans = firstParagraph.getElementsByTagName("span");

Para sa makasaysayang mga kadahilanan, ang klase ng HTMLDocument ay tumutukoy sa mga espesyal na katangian upang ma-access ang ilang mga uri ng mga node. Ari-arian mga larawan, mga form At mga link, halimbawa, sumangguni sa mga bagay na kumikilos tulad ng mga read-only na array na naglalaman ng mga elemento , At (ngunit ang mga tag na iyon lamang , na mayroong isang href attribute). Ang mga katangiang ito ay tumutukoy sa HTMLCollection object, na halos katulad ng mga NodeList object, ngunit maaari ding ma-index ng mga value ng id at name attributes.

Tinutukoy din ng HTMLDocument object ang magkasingkahulugan na mga property na embed at plugin, na mga koleksyon ng mga elemento ng HTMLCollection. Ang ari-arian ng mga anchor ay hindi karaniwan, ngunit maaari itong magamit upang ma-access ang mga elemento , na may katangian ng pangalan ngunit walang katangian ng href. Ang katangian ng mga script ay tinukoy ng pamantayan ng HTML5 at isang koleksyon ng mga elemento ng HTMLCollection.

Bilang karagdagan, ang HTMLDocument object ay tumutukoy sa dalawang katangian, ang bawat isa ay tumutukoy hindi sa isang koleksyon, ngunit sa isang solong elemento. Ang document.body property ay kumakatawan sa HTML document element, at ang document.head property ay kumakatawan sa . Ang mga pag-aari na ito ay palaging tinukoy sa dokumento: kahit na ang pinagmulang dokumento ay walang mga elemento at mga elemento, ang browser ay gagawa ng mga ito nang tahasan. Ang documentElement property ng isang Document object ay tumutukoy sa root element ng dokumento. Sa mga HTML na dokumento ay palaging kinakatawan nito ang .

Pagpili ng mga elemento ayon sa klase ng CSS

Ang value ng HTML class attribute ay isang listahan ng zero o higit pang mga identifier, na pinaghihiwalay ng mga puwang. Binibigyang-daan ka nitong tukuyin ang mga hanay ng mga kaugnay na elemento ng dokumento: anumang mga elemento na may parehong identifier sa katangian ng klase ay bahagi ng parehong hanay. Ang klase ng salita ay nakalaan sa JavaScript, kaya ang client-side na JavaScript ay gumagamit ng className property upang iimbak ang halaga ng HTML class attribute.

Karaniwang ginagamit ang attribute ng klase kasabay ng CSS cascading style sheet para maglapat ng karaniwang istilo ng pag-render sa lahat ng miyembro ng isang set. Gayunpaman, bilang karagdagan, tinutukoy ng pamantayan ng HTML5 ang getElementsByClassName() na pamamaraan, na nagbibigay-daan sa iyong pumili ng maraming elemento ng dokumento batay sa mga identifier sa kanilang mga katangian ng klase.

Tulad ng getElementsByTagName() method, ang getElementsByClassName() method ay maaaring tawagin sa parehong HTML na dokumento at HTML elements, at nagbabalik ng live na NodeList object na naglalaman ng lahat ng descendants ng dokumento o elemento na tumutugma sa pamantayan sa paghahanap.

Ang getElementsByClassName() method ay tumatagal ng isang string argument, ngunit ang string mismo ay maaaring maglaman ng maraming identifier, na pinaghihiwalay ng mga puwang. Ang lahat ng elemento na ang mga attribute ng klase ay naglalaman ng lahat ng tinukoy na identifier ay ituturing na tugma. Ang pagkakasunud-sunod ng mga identifier ay hindi mahalaga. Tandaan na sa parehong katangian ng klase at argumento sa pamamaraang getElementsByClassName(), ang mga identifier ng klase ay pinaghihiwalay ng mga puwang sa halip na mga kuwit.

Nasa ibaba ang ilang halimbawa ng paggamit ng getElementsByClassName() na pamamaraan:

// Find all elements with class "warning" var warnings = document.getElementsByClassName("babala"); // Hanapin ang lahat ng mga inapo ng isang elemento na may mga identifier na "log" // na may mga klase na "error" at "fatal" var log = document.getElementById("log"); var fatal = log.getElementsByClassName("fatal error");

Pagpili ng Mga Elemento Gamit ang CSS Selectors

Ang CSS Cascading Style Sheets ay may napakalakas na syntactic construct na kilala bilang mga selector na nagbibigay-daan sa iyong ilarawan ang mga elemento o set ng mga elemento sa isang dokumento. Kasama ng pag-standardize ng mga tagapili ng CSS3, ang isa pang pamantayan ng W3C na kilala bilang Selectors API ay tumutukoy sa mga pamamaraan ng JavaScript para sa pagkuha ng mga elemento na tumutugma sa isang tinukoy na tagapili.

Ang susi sa API na ito ay ang querySelectorAll() method ng Document object. Ito ay tumatagal ng isang string argument na may CSS selector at nagbabalik ng NodeList object na kumakatawan sa lahat ng elemento ng dokumento na tumutugma sa selector.

Bilang karagdagan sa querySelectorAll() na pamamaraan, ang object ng dokumento ay tumutukoy din sa isang querySelector() method, na katulad ng querySelectorAll() method maliban na ito ay nagbabalik lamang ng una (sa pagkakasunud-sunod ng dokumento) na tumutugmang elemento, o null kung walang tumutugmang mga elemento.

Ang dalawang pamamaraan na ito ay tinukoy din ng klase ng Mga Elemento. Kapag tinawag sila sa isang elemento, hahanapin ang buong dokumento para sa isang tugma para sa ibinigay na tagapili, at pagkatapos ay sinasala ang resulta upang isama lamang ang mga inapo ng elementong ginamit. Ang diskarte na ito ay maaaring mukhang counterintuitive dahil nangangahulugan ito na ang selector string ay maaaring magsama ng mga ninuno ng elementong itinutugma.

Istraktura ng dokumento at pag-navigate sa dokumento

Pagkatapos pumili ng elemento ng dokumento, kung minsan ay kinakailangan na maghanap ng mga bahagi ng dokumento na may kaugnayan sa istruktura (magulang, kapatid, anak). Ang isang bagay na Dokumento ay maaaring isipin bilang isang puno ng mga bagay na Node. Ang uri ng Node ay tumutukoy sa mga katangian na nagbibigay-daan sa iyong mag-navigate sa gayong puno. May isa pang interface ng application para sa pag-navigate ng dokumento, tulad ng Element object tree.

Mga dokumento bilang mga node tree

Ang Document object, ang Element object nito, at ang Text object na kumakatawan sa mga fragment ng text sa dokumento ay lahat ng Node object. Ang klase ng Node ay tumutukoy sa mga sumusunod na mahahalagang katangian:

parentNode

Ang parent node ng node na ito, o null para sa mga node na walang parent, gaya ng Document.

childNodes

Isang nababasang bagay na tulad ng array (NodeList) na nagbibigay ng representasyon ng mga child node.

unang anak, huling anak

Ang una at huling child node, o null kung ang ibinigay na node ay walang child node.

susunodKapatid, datiKapatid

Susunod at naunang kapatid na node. Ang magkapatid na node ay dalawang node na may parehong magulang. Ang pagkakasunud-sunod kung saan lumitaw ang mga ito ay tumutugma sa pagkakasunud-sunod sa dokumento. Ang mga katangiang ito ay nagli-link ng mga node sa isang dobleng naka-link na listahan.

nodeType

Ang uri ng node na ito. Ang mga node ng uri ng Dokumento ay may halaga na 9 sa property na ito. Mga node ng uri ng Element - halaga 1. Mga node ng teksto ng uri ng Teksto - halaga 3. Mga node ng uri Mga Komento - halaga 8 at mga node ng uri ng DocumentFragment - halaga 11.

nodeValue

Text content ng Text at Comment node.

nodeName

Ang pangalan ng isang Element tag na may lahat ng character na na-convert sa uppercase.

Gamit ang mga katangiang ito ng klase ng Node, maaari mong i-reference ang pangalawang child node ng unang child node ng Document object, tulad ng ipinapakita sa ibaba:

Document.childNodes.childNodes == document.firstChild.firstChild.nextSibling

Ipagpalagay natin na ang pinag-uusapang dokumento ay may sumusunod na anyo:

TestHello World!

Pagkatapos ay ang pangalawang child node ng unang child node ang magiging elemento. Sa property ng nodeType naglalaman ito ng value 1 at sa property na nodeName naglalaman ito ng value na "BODY".

Gayunpaman, tandaan na ang API na ito ay lubhang sensitibo sa mga pagbabago sa teksto ng dokumento. Halimbawa, kung nagdagdag ka ng isang line feed sa pagitan ng mga at tag sa dokumentong ito, ang line feed na character na iyon ay magiging unang child node (Text node) ng unang child node, at ang pangalawang child node ay magiging elemento, hindi .

Mga dokumento bilang mga puno ng elemento

Kapag ang pangunahing interes ay nasa mismong mga elemento ng dokumento, sa halip na sa teksto sa loob ng mga ito (at ang puting espasyo sa pagitan ng mga ito), mas maginhawang gumamit ng interface ng application na nagbibigay-daan sa iyo upang bigyang-kahulugan ang dokumento bilang isang puno ng mga bagay na Elemento , binabalewala ang mga Text at Comment node na bahagi rin ng dokumento.

Ang unang bahagi ng interface ng application na ito ay ang child property ng Element objects. Tulad ng childNodes property, ang value nito ay isang NodeList object. Gayunpaman, hindi tulad ng childNodes property, ang listahan ng mga bata ay naglalaman lamang ng mga Element object.

Tandaan na ang Text at Comment node ay walang child node. Nangangahulugan ito na ang property na Node.parentNode na inilarawan sa itaas ay hindi kailanman nagbabalik ng mga node na may uri ng Text o Comment. Ang halaga ng parentNode property ng anumang Element object ay palaging isa pang Element object o ang ugat ng tree - isang Document o DocumentFragment object.

Ang pangalawang bahagi ng interface ng application para sa pag-navigate sa mga elemento ng dokumento ay ang mga katangian ng object ng Element, katulad ng mga katangian para sa pag-access ng mga node ng bata at kapatid ng Node object:

firstElementChild, lastElementChild

Katulad ng firstChild at lastChild properties, ngunit ibalik ang child elements.

nextElementSibling, previousElementSibling

Katulad ng nextSibling at previousSibling properties, pero ibalik ang sibling elements.

childElementCount

Bilang ng mga elemento ng bata. Ibinabalik ang parehong halaga ng mga child.length property.

Ang mga katangian ng pag-access ng elemento ng bata at kapatid na ito ay na-standardize at ipinapatupad sa lahat ng kasalukuyang browser maliban sa IE.


Ang Document Object Model, o "DOM", ay isang programming interface para sa pag-access ng mga elemento ng mga web page. Sa pangkalahatan, ito ay isang page API na nagbibigay-daan sa iyong basahin at manipulahin ang nilalaman, istraktura, at mga istilo ng isang pahina. Alamin natin kung paano ito gumagana at kung paano ito gumagana.

Paano nabuo ang isang web page?

Ang proseso ng pagbabago ng orihinal na HTML na dokumento sa isang renderable, istilo at interactive na pahina ay tinatawag na "Critical Rendering Path". Bagama't ang prosesong ito ay maaaring hatiin sa ilang hakbang, gaya ng inilarawan ko sa Pag-unawa sa Pag-render ng Kritikal na Landas, ang mga hakbang na ito ay maaaring halos pagsama-samahin sa dalawang hakbang. Sa una, pina-parse ng browser ang dokumento para matukoy kung ano ang ipapakita sa page, at sa pangalawa, ginagawa ng browser ang pag-render.

Ang resulta ng unang yugto ay tinatawag na "render tree". Ang rendering tree ay isang representasyon ng mga elemento ng HTML na ire-render sa isang page at ang mga nauugnay na istilo nito. Upang mabuo ang punong ito, kailangan ng browser ng dalawang bagay:

  • CSSOM, na kumakatawan sa mga istilong nauugnay sa mga elemento
  • DOM, representasyon ng elemento
  • Ano ang binubuo ng DOM?

    Ang DOM ay isang object na representasyon ng orihinal na HTML na dokumento. Ito ay may ilang mga pagkakaiba, tulad ng makikita natin sa ibaba, ngunit mahalagang ito ay isang pagtatangka na i-convert ang istraktura at nilalaman ng isang HTML na dokumento sa isang object model na maaaring magamit ng iba't ibang mga programa.

    Ang istraktura ng mga bagay sa DOM ay kinakatawan ng tinatawag na "node tree". Tinatawag itong gayon dahil maaari itong isipin bilang isang puno na may isang magulang na sumasanga sa ilang mga sanga ng bata, na ang bawat isa ay maaaring may mga dahon. Sa kasong ito, ang "elemento" ng magulang ay ang elemento ng ugat, ang "mga sanga" ng bata ay ang mga nested na elemento, at ang "mga dahon" ay ang mga nilalaman sa loob ng mga elemento.

    Kunin natin ang HTML na dokumentong ito bilang isang halimbawa:

    Ang aking unang web page Kumusta, mundo!

    Kamusta ka?

    Ang dokumentong ito ay maaaring katawanin bilang sumusunod na puno ng mga node:

    • html
      • ulo
        • pamagat
          • Ang aking unang web page
      • katawan
        • h1
          • Hello, mundo!
        • p
          • Kamusta ka?
    Ano ang hindi DOM

    Sa halimbawa sa itaas, lumalabas na ang DOM ay isang 1:1 na pagmamapa ng orihinal na HTML na dokumento. Gayunpaman, tulad ng sinabi ko dati, may mga pagkakaiba. Upang lubos na maunawaan kung ano ang DOM, kailangan nating tingnan kung ano ito.

    Ang DOM ay hindi isang kopya ng orihinal na HTML

    Kahit na ang DOM ay nilikha mula sa isang HTML na dokumento, hindi ito palaging eksaktong pareho. Mayroong dalawang kaso kung saan maaaring mag-iba ang DOM mula sa pinagmulang HTML.

    1. Kapag naglalaman ang HTML ng mga error sa markup

    Ang DOM ay ang interface para sa pag-access sa aktwal (iyon ay, nai-render na) na mga elemento ng isang HTML na dokumento. Sa panahon ng proseso ng paglikha ng DOM, ang browser mismo ay maaaring itama ang ilang mga error sa HTML code.

    Isaalang-alang ang HTML na dokumentong ito bilang isang halimbawa:

    Hello, mundo!

    Ang dokumento ay kulang sa mga elemento at , na isang kinakailangan para sa HTML. Ngunit kung titingnan natin ang nagresultang puno ng DOM, makikita natin na naayos na ito:

    • html
      • ulo
      • katawan
        • Hello, mundo!
      2. Kapag ang DOM ay binago ng Javascript code

      Bilang karagdagan sa pagiging interface para sa pagtingin sa mga nilalaman ng isang HTML na dokumento, ang DOM mismo ay maaari ding baguhin.

      Maaari kaming, halimbawa, lumikha ng mga karagdagang node para sa DOM gamit ang Javascript.

      Var newParagraph = document.createElement("p"); var paragraphContent = document.createTextNode("Ako ay bago!");newParagraph.appendChild(paragraphContent);document.body.appendChild(newParagraph);

      Babaguhin ng code na ito ang DOM, ngunit hindi lilitaw ang mga pagbabago sa HTML na dokumento.

      Ang DOM ay hindi ang nakikita mo sa browser (i.e. ang rendering tree)

      Sa viewport ng browser makikita mo ang rendering tree, na gaya ng sinabi ko ay kumbinasyon ng DOM at CSSOM. Ano ang naiiba sa DOM at sa render tree ay ang huli ay binubuo lamang ng kung ano ang ire-render sa screen.

      Dahil ang render tree ay nauugnay lamang sa kung ano ang na-render, hindi nito kasama ang mga elemento na biswal na nakatago. Halimbawa, ang mga elementong may mga istilo na may display: wala .

      Hello, mundo!

      Kamusta ka?

      Isasama ng DOM ang elemento

      • html
        • ulo
        • katawan
          • h1
            • Hello, mundo!
          • p
            • Kamusta ka?

      Gayunpaman, ang render tree, at samakatuwid ay kung ano ang nakikita sa viewport, ay hindi isasama sa elementong ito.

      • html
        • katawan
          • h1
            • Hello, mundo!
      Ang DOM ay hindi ang ipinapakita sa DevTools

      Ang pagkakaibang ito ay bahagyang mas maliit dahil ang DevTools Element Inspector ay nagbibigay ng pinakamalapit na approximation sa DOM na mayroon kami sa browser. Gayunpaman, ang DevTools inspector ay naglalaman ng karagdagang impormasyon na wala sa DOM.

      Ang pinakamagandang halimbawa nito ay ang CSS pseudo-elements. Ang mga pseudo element na ginawa gamit ang ::before at ::after ay bahagi ng CSSOM at rendering tree, ngunit hindi ito teknikal na bahagi ng DOM. Ito ay dahil ang DOM ay nilikha lamang mula sa orihinal na HTML na dokumento, hindi kasama ang mga istilong inilapat sa elemento.

      Kahit na ang mga pseudo-element ay hindi bahagi ng DOM, ang mga ito ay nasa aming devtools element inspector.


      Buod

      Ang DOM ay ang interface sa HTML na dokumento. Ginagamit ito ng mga browser bilang unang hakbang sa pagtukoy kung ano ang ire-render sa viewport, at ng Javascript code upang baguhin ang nilalaman, istraktura, o istilo ng isang page.

    Sa tutorial na ito titingnan natin ang mga pangunahing kaalaman sa pagtatrabaho sa mga kaganapan, katangian at getElementById sa JavaScript.

    Sa nakaraang mga aralin, pinag-aralan namin ang mga pangunahing kakayahan ng wikang JavaScript. Simula sa araling ito, gagawin namin kung para saan talaga ang JavaScript - babaguhin namin ang mga elemento ng HTML page at tutugon sa mga aksyon ng user. Ang aming mga script ay magiging mas kahanga-hanga at kapaki-pakinabang.

    Magsisimula kami sa pagtuturo sa aming code na tumugon sa mga aksyon ng user ng site. Halimbawa, magki-click ang user sa isang lugar gamit ang mouse, at ang aming code bilang tugon ay kailangang iproseso ang pag-click na ito at ipakita ang ilang impormasyon sa screen.

    Ang mga pagkilos ng user na masusubaybayan namin sa pamamagitan ng JavaScript ay tinatawag na mga kaganapan. Ang mga kaganapan ay maaaring ang mga sumusunod: umiyak mouse sa isang elemento ng pahina, gabay mouse sa isang elemento ng page o vice versa - pangangalaga mouse cursor mula sa isang elemento at iba pa. Bilang karagdagan, may mga kaganapan na hindi nakadepende sa mga aksyon ng user, halimbawa, ang kaganapan kapag ang isang HTML na pahina ay na-load sa browser.

    Mayroong ilang mga paraan upang gumana sa mga kaganapan sa JavaScript. Magsisimula tayo sa pinakasimple sa kanila.

    Pangunahing Kaganapan

    Ang pinakamadaling paraan upang itakda ang tugon ng isang elemento sa isang partikular na kaganapan ay ang tukuyin ito gamit ang isang katangian para sa isang partikular na tag. Halimbawa, isang kaganapan "pag-click ng mouse" tumutugma sa onclick attribute, event "itaas ang mouse"- ang katangian ng onmouseover, at ang kaganapan "mga dahon ng cursor na elemento"- katangian ng onmouseout.

    Ang value ng attribute na may event ay JavaScript code. Sa sumusunod na halimbawa sa pamamagitan ng pag-click sa isang pindutan gamit ang mouse ang function ng alerto ay isasagawa:

    At ngayon sa pamamagitan ng pag-click ang function ng func ay isasagawa sa elemento:

    function func() ( alert("!"); )

    Maaari kang magsagawa ng hindi lamang isang function, ngunit marami:

    function func1() ( alert("1"); ) function func2() ( alert("2"); )

    Pakitandaan na kung kailangan mo ng double quotes sa loob ng isang attribute (halimbawa, para sa isang string) at ang mga panlabas na quotes ng attribute ay double quotes din - onclick="alert("!")"- hindi gagana ang code na ito.

    Mayroong ilang mga paraan upang labanan ito: maaari mong baguhin ang mga panlabas na quote sa mga solong quote onclick="alert("!")", maaari ka ring makatakas sa mga panloob na panipi gamit ang backslash onclick="alerto(\"!\)" o ilipat lang ang JavaScript code mula sa attribute papunta sa function, at iwanan lang ang function name sa attribute onclick="func()".

    Ang parehong bagay ay mangyayari kung ilalagay mo ang mga panlabas na quote ng katangian sa mga solong quote at gagamit din ng mga solong quote para sa string: onclick="alert("!")"- dito, din, ang lahat ay nalutas sa magkatulad na paraan.

    Talahanayan ng katangian para sa mga kaganapan Paggawa gamit ang getElementById

    Ngayon ay matututunan natin kung paano tumanggap ng mga elemento ng HTML page at magsagawa ng iba't ibang mga manipulasyon sa kanila (magagawa nating baguhin, halimbawa, ang kanilang teksto at kulay at marami pang ibang kapaki-pakinabang na bagay).

    Sabihin nating mayroon kaming tag sa page na may id attribute na nakatakdang subukan . Isulat natin ang link sa tag na ito sa elem variable. Upang gawin ito, dapat nating gamitin ang getElementById method, na nakakakuha ng elemento sa pamamagitan ng id nito.

    Ang entry na ito ay magaganap kapag na-click ang button kung saan namin itinalaga ang onclick attribute. Sa pamamagitan ng pag-click sa button na ito, gagana ang function na func, na makakahanap ng elemento sa HTML page na may id na katumbas ng pagsubok at pagsusulat link dito sa elem variable:

    Ngayon sa elem variable mayroon kaming link sa isang elemento na may id attribute sa test value. Ang variable elem mismo ay bagay.

    Ang object na ito at ang HTML page tag ay konektado sa isa't isa - maaari naming baguhin ang anumang mga katangian ng elem object at sa parehong oras ay makikita namin ang mga pagbabago sa HTML page na mangyayari sa elementong natanggap namin.

    Tingnan natin kung paano ito nangyayari sa pagsasanay.

    Mga pangunahing kaalaman sa pagtatrabaho sa mga katangian ng HTML sa pamamagitan ng JavaScript

    Ngayon ay babasahin natin at babaguhin ang mga katangian ng tag. Muli tayong magkaroon ng input na may id na katumbas ng pagsubok at isang button, sa pag-click kung saan ilulunsad ang func function:

    Sa loob ng function ng func matatanggap namin ang aming input sa pamamagitan ng kanyang id at magsulat ng isang link dito sa elem variable:

    function func() ( var elem = document.getElementById("test"); )

    Ipakita natin ngayon ang mga nilalaman ng ating mga input attribute. Upang ma-access, halimbawa, ang value attribute, dapat mong isulat ang sumusunod: elem.value , kung saan ang elem ay ang variable kung saan kami nagsulat ng link sa aming elemento gamit ang getElementById, at ang value ay ang attribute ng tag na interesado kami.

    Maaari naming ipakita ang mga nilalaman ng katangian sa pamamagitan ng alerto sa ganitong paraan - alerto(elem.value) - o isulat ito sa ilang variable. Gawin natin ito:

    function func() ( var elem = document.getElementById("test"); alert(elem.value); //ay magpapakita ng "!" )

    Maaari naming basahin ang mga halaga ng iba pang mga katangian sa parehong paraan, halimbawa, elem.id - binabasa namin ang halaga ng katangian ng id, at elem.type - ang halaga ng katangian ng uri. Tingnan ang halimbawa:

    function func() ( var elem = document.getElementById("test"); alert(elem.value); //magpapakita ng "!" alert(elem.id); //magpapakita ng "test" alert(elem.type ); // ay magpapakita ng "teksto")

    Hindi mo lang mababasa ang mga value ng attribute, ngunit mababago mo rin ang mga ito. Para, halimbawa, baguhin ang value ng value attribute, kailangan mo lang itong italaga sa elem.value construct:

    function func() ( var elem = document.getElementById("test"); elem.value = "www"; //присвоим новое значение атрибуту value } !}

    Magiging ganito ang HTML code (ang value attribute ay magiging www):

    Well, ngayon ang pinakamahirap na bagay - hindi ka maaaring pumasok sa elem variable, ngunit bumuo ng isang kadena ng mga puntos sa ganitong paraan:

    function func() ( alert(document.getElementById("test").value); //ay magpapakita ng "!" )

    Sa parehong paraan (chain) maaari mong muling isulat ang mga katangian:

    function func() ( document.getElementById("test").value = "www"; }!}

    Gayunpaman, sa karamihan ng mga kaso, ang pagpapakilala ng isang variable ay mas maginhawa. Ihambing ang dalawang halimbawa - ngayon ay ipinakilala ko ang elem variable at maaaring magbasa ng anumang bilang ng mga katangian, habang ang getElementById ay tinatawag minsan lang:

    function func() ( var elem = document.getElementById("test"); elem.value = "www"; elem.type = "submit"; }!}

    Ngayon hindi ako nagpapakilala ng isang bagong variable at kaya kailangan kong tawagan ang getElementById nang dalawang beses:

    function func() ( document.getElementById("test").value = "www"; document.getElementById("test").type = "submit"; }!}

    Sa aking opinyon, ang code na ito ay naging mas kumplikado, kahit na ito ay tumatagal ng isang mas kaunting linya. Bilang karagdagan, kung gusto kong baguhin ang halaga ng id mula sa pagsubok sa, halimbawa, www, kailangan kong gawin ito sa maraming lugar, na hindi masyadong maginhawa.

    sa browser. Ang paghahanap ng mga elemento sa isang page, na ginagawa ng getElementById method, ay medyo mabagal na operasyon ( at sa pangkalahatan ang anumang gawain sa mga elemento ng pahina ay isang mabagal na operasyon- Alalahanin mo ito).

    Sa aming kaso, kung gagamit kami ng getElementById sa bawat oras, pagkatapos ay ipoproseso ng browser ang HTML page sa bawat oras at maghahanap ng elementong may ibinigay na id nang maraming beses (hindi mahalaga na pareho ang mga id - gagawin ng browser ang lahat ang mga aksyon nang maraming beses), nagsasagawa ng mga walang kwentang operasyon na maaaring makapagpabagal sa pagpapatakbo ng browser.

    Kung gagamitin natin ang elem variable, walang paghahanap sa page na magaganap (ang elemento ay natagpuan na at ang link dito ay nasa elem variable).

    Mga pagbubukod: klase at para sa mga katangian

    Natutunan mo na kung paano gumawa ng mga katangian sa pamamagitan ng JavaScript at ngayon ay oras na para sabihin sa iyo na hindi lahat ay napakasimple - mayroong isang pagbubukod kapag nagtatrabaho sa mga katangian - ito ang katangian ng klase.

    Espesyal ang salitang ito sa JavaScript at samakatuwid ay hindi tayo basta basta magsulat elem.klase upang basahin ang halaga ng katangian ng klase. Sa halip ay magsulat ka elem.className.

    Ang sumusunod na halimbawa ay nagpapakita ng halaga ng katangian ng klase:

    function func() ( var elem = document.getElementById("test"); alert(elem.className); )

    Sa pamamagitan ng paraan, may iba pang mga katangian na tinatawag na naiiba kaysa sa mga katangian. Halimbawa, ang for() attribute ay may property na tinatawag na htmlFor.

    Paggawa gamit ito

    Ngayon ay gagana tayo sa isang espesyal na bagay na ito, na tumuturo sa kasalukuyang elemento (ang elemento kung saan naganap ang kaganapan). Bukod dito, ito ay nagpapahiwatig na ang elementong ito ay nakuha na ng getElementById method.

    Tingnan natin kung paano ito gagawin at kung ano ang kaginhawahan ng diskarteng ito.

    Magkaroon tayo ng gawain ng pag-click sa isang input upang ipakita ang mga nilalaman ng halaga nito.

    Sa ngayon maaari mo lamang gawin ang desisyong ito:

    function func() ( var elem = document.getElementById("test"); alert(elem.value); )

    Sa prinsipyo, ang solusyon na ito ay mabuti, ngunit ngayon isipin na mayroon kaming maraming mga input at kapag nag-click kami sa bawat isa, kailangan naming ipakita ang halaga nito.

    Sa kasong ito, magtatapos tayo sa isang bagay na tulad nito:

    function func1() ( var elem = document.getElementById("test1"); alert(elem.value); ) function func2() ( var elem = document.getElementById("test2"); alert(elem.value); ) function func3() ( var elem = document.getElementById("test3"); alert(elem.value); )

    Ngayon ang disbentaha ng aming diskarte ay malinaw na nakikita - para sa bawat input kailangan naming lumikha ng aming sariling pag-click sa pagpoproseso ng function, at ang mga function na ito ay halos parehong bagay.

    Kung mayroon tayong 10 input, kailangan nating gumawa ng 10 function, na hindi maginhawa.

    Pasimplehin natin ang ating gawain: ipapasa natin ang id ng kasalukuyang elemento bilang parameter sa function. At sa halip na isang malaking bilang ng mga pag-andar, ang lahat ay mababawasan sa isang pag-andar:

    function func(id) ( var elem = document.getElementById(id); alert(elem.value); )

    Gayunpaman, ang solusyon na ito ay mayroon pa ring disbentaha - ang bawat elemento ay kailangang magpasok ng ibang id, na medyo hindi rin maginhawa.

    Kaya, sa wakas ay tingnan natin ang opsyon ng paglutas ng problema gamit ito .

    Gawin natin ito upang ang bawat input ay magpapakita ng nilalaman nito kapag na-click. Upang gawin ito, ipinapasa namin ang bagay na ito bilang isang parameter sa function, tulad nito: func(this) .

    Ang aming ito ay ipinasa bilang isang parameter ng function at nagtatapos sa elem variable. Ang elem na ito ay kumikilos na parang ito ay nakuha sa ganitong paraan: var elem = document.getElementById(...), ngunit hindi mo kailangang matanggap ito sa ganitong paraan, handa na ang lahat doon at magagamit mo ito. Halimbawa, itinuturo ng elem.value ang halaga ng aming input at iba pa.

    Kaya, narito ang pinakasimpleng solusyon sa aming problema:

    function func(elem) ( alert(elem.value); )

    Mga Pangunahing Kaalaman sa CSS

    Sa JavaScript, ang pagtatrabaho sa mga katangian ng CSS ay nangyayari sa pamamagitan ng pagbabago ng halaga ng katangian ng estilo para sa isang elemento. Halimbawa, upang baguhin ang kulay na kailangan mong buuin ang sumusunod na kadena - elem.style.color- at italaga dito ang nais na halaga ng kulay:

    function func() ( var elem = document.getElementById("test"); elem.style.color = "red"; )

    Hindi mo rin maaaring ipasok ang elem variable, ngunit bumuo isang napakahabang kadena.


    Ang gulo talaga ng topic. Ngunit, tulad ng sinasabi nila, ang diyablo ay hindi kasingkilabot bilang siya ay ipininta. Ito ay kung saan nakukuha ko ang pinakamatigas na mani: ang sobrang gawaing ito ng "pagpinta nito" bilang natutunaw hangga't maaari, ngunit hindi ganap na primitive. Sa ngayon, ang lahat ng mga materyales na nabasa ko ay malamang na maging abstruse o primitive.

    Ano ang DOM

    Ang abbreviation na DOM ay kumakatawan sa Modelo ng Bagay ng Dokumento(modelo ng object ng dokumento).

    Ang DOM ay isang programming interface para sa pag-access sa nilalaman ng HTML, XHTML at XML na mga dokumento, iyon ay, kumakatawan sa HTML, XHTML at XML na mga tag at katangian, pati na rin ang mga istilo ng CSS bilang mga bagay sa programming. Parehong gumagana ang JavaScript at iba pang mga wika sa web programming sa modelong ito.

    Isang maliit na kasaysayan

    Mayroong 4 na antas ng DOM (0, 1, 2 at 3).

    Kasama sa Level 0 (1996) ang mga modelo ng DOM na umiral bago ang Level 1. Pangunahing mga koleksyon ito: document.images, document.forms, document.layers at document.all. Ang mga modelong ito ay hindi pormal na mga detalye ng DOM na inilathala ng W3C. Sa halip, kinakatawan nila ang impormasyon tungkol sa kung ano ang umiiral bago nagsimula ang proseso ng standardisasyon.

    Kasama rin sa Antas 1 (1997) ang pangunahing pag-andar para sa pagproseso ng mga dokumentong XML: maraming paraan upang gumana sa mga indibidwal na node, magtrabaho kasama ang mga tagubilin sa pagproseso ng XML, atbp.

    Bilang karagdagan, ang antas 1 ng DOM ay naglalaman ng ilang mga espesyal na interface na maaaring pangasiwaan ang mga indibidwal na elemento ng HTML. Halimbawa, maaari kang magtrabaho sa mga HTML na talahanayan, form, listahan ng pagpili, atbp.

    Nagdagdag ang DOM Level 2 (2002) ng ilang bagong feature.

    Habang ang DOM Level 1 ay walang suporta para sa mga namespace, ang DOM Level 2 na mga interface ay naglalaman ng mga pamamaraan para sa pamamahala ng mga namespace na nauugnay sa mga kinakailangan para sa pagbuo at pagproseso ng mga XML na dokumento.

    Bilang karagdagan, ang DOM level 2 ay sumusuporta sa mga kaganapan.

    Ang Antas 2 ay ang kasalukuyang antas ng detalye ng DOM, ngunit ang W3C ay nagrerekomenda ng ilang seksyon ng detalye ng Antas 3.

    Ang DOM Level 3 ay isang gumaganang draft ng detalye na nagpapalawak sa functionality ng DOM Level 2. Ang isa sa pinakamahalagang feature ng bersyong ito ng detalye ay ang kakayahang magtrabaho kasama ang maraming extension ng DOM.

    Ano ang ibig sabihin ng "interface ng software"?

    Ang interface ng salitang Ingles ay maaaring isalin bilang "contact area". Ang isang computer, sa halos pagsasalita, ay nakakaunawa lamang ng dalawang bagay: isang walang laman na bit at isang punong piraso. Ang wikang "sinasalita" ng isang computer ay maaaring isipin bilang isang walang katapusang string ng mga zero at isa, na nagbibigay ng walang katapusang bilang ng iba't ibang mga kumbinasyon.

    Ang anumang code ng programa ay isang interpretasyon, naiintindihan ng programmer, ng mga "zero at isa" na ito kung saan gumagana ang computer. Kaya, ang anumang programming language ay isang human-machine interface.

    Gumagana ang mga browser tulad ng ibang mga application sa computer. Binibigyang-kahulugan nila ang HTML, XML, CSS code, JavaScript, PHP, Perl, atbp. sa "mga zero at isa." Upang harapin ang multilinggwalismong ito, kailangan ang isang karaniwang plataporma. Ang platform na ito ay ang DOM - isang detalye na hindi nakadepende sa isang partikular na programming language o markup. Ito ay isang interface na maaaring magamit sa maraming sikat na programming language na nauugnay sa paglikha ng mga web page at may kakayahang maunawaan at bigyang-kahulugan ang mga bagay ng DOM.

    DOM at mga browser

    DOM at JavaScript

    Sa JavaScript, ang tuktok ng hierarchical ladder ng mga object ng DOM, isang uri ng "conductor" sa interface na ito, ay ang object ng dokumento, at ang mga object ng DOM ay nagiging mga katangian nito, mga katangian ng mga katangian nito, atbp. Tinatawag din silang mga DOM node.

    Mga node ng DOM

    Mayroong 12 uri ng mga node sa DOM level 2. Ang bawat uri ng DOM node ay itinalaga ng isang pare-pareho na may natatanging pangalan. Karamihan sa mga node ay idinisenyo upang gumana sa XML. Sa HTML - JavaScript assembly na ginagawa namin, 5 uri lang ang magagamit. Ngunit kahit na ang "tip of the iceberg" na ito ay isang napaka "kumakalat na puno" na hindi maaaring saklawin sa isa o dalawang aralin.

    Ang buong hanay ng mga constant ng uri ng node na tinukoy sa detalye ng W3C DOM (mga node na available para sa HTML - naka-highlight ang JavaScript sa kulay asul):

    Palagiang pangalan

    Ibig sabihin

    Paglalarawan

    Node.ELEMENT_NODE

    Element Node (ibinabalik ang root element ng dokumento, para sa mga HTML na dokumento ito ang HTML element)

    Node.ATTRIBUTE_NODE

    Attribute node (nagbabalik ng attribute ng isang XML o HTML na elemento ng dokumento)

    Text node (#text)

    Node.CDATA_SECTION_NODE

    CDATA section node (XML: isang alternatibong syntax para sa pagpapakita ng data ng character)

    Node.ENTITY_REFERENCE_NODE

    Node.ENTITY_NODE

    Partition node

    Node.PROCESSING_INSTRUCTION_NODE

    XML Directive Node

    Node.COMMENT_NODE

    Node ng komento

    Node.DOCUMENT_NODE

    Document node (ang batayan para sa pag-access sa nilalaman ng dokumento at paglikha ng mga bahagi nito)

    Node.DOCUMENT_TYPE_NODE

    Node ng uri ng dokumento (ibinabalik ang uri ng dokumentong ito, ibig sabihin, ang halaga ng tag na DOCTYPE)

    Node.DOCUMENT_FRAGMENT_NODE

    Document fragment node (pag-extract ng bahagi ng document tree, paglikha ng bagong fragment ng dokumento, pagpasok ng fragment bilang anak ng isang node, atbp.)

    Node.NOTATION_NODE

    Notation node*

    * Ang mga notasyon ay mga pangalan na tumutukoy sa format ng mga hindi na-parse na seksyon, ang format ng mga elemento na may katangian ng notasyon, o ang application program kung saan ang direktiba ay tinutugunan. (Hindi malinaw? Hindi pa rin ako sigurado.)

    Istraktura ng dokumento sa DOM

    Ang lahat ng mga object ng dokumento ay mga DOM node. Tingnan natin ang isang pangunahing dokumento:

    < title>DOM Header

    Teksto ng talata

    Narito ang isang diagram ng DOM tree nito:

    Ang bawat node ay maaaring magkaroon ng mga child node (ang mga arrow ay humahantong sa kanila sa diagram). Ang object ng dokumento - ang base ng puno ng dokumento - ay isa ring node, ngunit wala itong parent node at may ilang mga katangian at pamamaraan na wala ang ibang mga node. Mayroon itong isang child node: element.

    Ang isang elemento ay may dalawang child node: at , kung saan ang lahat ng elementong nakapaloob sa mga ito ay nagiging mga bata.

    Pansin!

    Ang "Element" at "tag" ay hindi magkasingkahulugan. Ang isang tag ay isang markup mark: - ito ay dalawang magkaibang tag. At ang isang elemento ay isang bagay na minarkahan ng mga tag na ito:

    Teksto ng talata

    .

    Mga elemento, at

    Naglalaman ng teksto sa loob. Ito ang mga node ng text ng kanilang anak. Ang elemento ay mayroon ding katangian: align="center" . Ang mga node ng katangian ay mga child node din ng mga elementong naglalaman ng mga ito.

    Kapag nagtatrabaho sa mga DOM tree node, ginagamit ang kanilang mga katangian at pamamaraan.

    Ang ilang mga katangian ng mga node

    Maliit na pagpapakilala

    Uulitin ko muli: kapag na-access natin ang mga elemento ng pahina sa mga script, hindi lamang tayo nakikitungo sa wikang Javascript, kundi pati na rin sa interface ng DOM na naka-embed dito. Minsan kailangan mong magkaroon ng kamalayan sa mga ito, kung minsan maaari mong kalimutan "na tayo ay nagsasalita sa prosa."

    Nagamit na namin ang ilang mga katangian at pamamaraan mula sa modelo ng object ng DOM sa ganitong paraan. Samakatuwid, paminsan-minsan ay magbibigay ako ng mga link sa mga nakaraang aralin.

    Sa araling ito, hindi kami pupunta sa "akademikong" ruta, isinasaalang-alang ang lahat ng mga katangian ng lahat ng mga node sa lahat ng mga browser. Una, kilalanin natin ang pinakapraktikal at "walang salungatan" sa kanila.

    Iyon ang dahilan kung bakit hindi kami magsisimula, gaya ng nakaugalian, gamit ang "mga pangunahing katangian": nodeName at nodeValue.

    tagName

    Nagbabalik ng string na naglalaman ng pangalan ng tag ng elemento. Ang lahat ng mga halaga ng tagName ay naglalaman lamang ng mga malalaking titik.

    Syntax

    elemento.tagName

    Halimbawa

    Pagsubok sa tagName property

    document.write(document.getElementById( "testTagName").tagName)

    Resulta

    Pagsubok sa tagName property

    innerHTML

    Nakatagpo na namin ang ari-arian na ito (tingnan ang Aralin 10). At ngayon naiintindihan na natin kung saan ito nanggaling: "mula sa bahay."

    Nagbibigay ng access sa mga nilalaman ng elemento. Tinutukoy hindi lamang ang nilalaman ng teksto, kundi pati na rin ang lahat ng mga tag ng HTML na matatagpuan sa loob ng elemento.

    Ang pag-aari na ito ay hindi lamang para sa pagbabasa, ngunit para din sa pagbabago ng nilalaman.

    Tandaan

    Sa IE, ang innerHTML ay read-only para sa ilang elemento: lahat ito ay mga elemento ng talahanayan, maliban sa at , pati na rin at .

    Halimbawa, gumawa kami ng isang walang laman na talahanayan na walang elemento at gusto naming ipasok ito sa programmatically sa pamamagitan ng innerHTML :








    Magtatapon ang IE ng "hindi kilalang runtime error" at gagawin ng ibang mga browser ang pag-paste.

    Kasabay nito, kung itatanong natin ang kasalukuyang nilalaman ng isang elemento , halimbawa, sa pamamagitan ng alert(document.getElementById("id").innerHTML) , pagkatapos ay gagana ito sa IE.

    Syntax

    elemento.innerHTML = "nakatalagang teksto"

    Halimbawa




    Talata upang ipasok



    // Binabasa ng function na ito ang teksto at ipinapasok ito sa ibinigay na talata.
    function testRead() (
    document.getElementById( "target").innerHTML = document.getElementById( "testInnerHTML").innerHTML
    }
    // Binabago ng function na ito ang teksto ng ibinigay na talata.
    function testChange() (
    document.getElementById( "target").innerHTML = "Muling kulayan at baguhin ang teksto"
    }
    // Ibinabalik ng function na ito ang property sa orihinal nitong posisyon.
    function testReset() (
    document.getElementById( "target").innerHTML = "Isingit na talata"
    }





    Pagsubok sa innerHTML property

    Talata upang ipasok

    Ang pangunahing tool para sa pagtatrabaho at mga dynamic na pagbabago sa page ay ang DOM (Document Object Model) - isang object model na ginagamit para sa XML/HTML na mga dokumento.

    Ayon sa modelo ng DOM, ang isang dokumento ay isang hierarchy.
    Ang bawat HTML tag ay bumubuo ng isang hiwalay na elemento ng node, ang bawat piraso ng teksto ay bumubuo ng isang elemento ng teksto, atbp.

    Sa madaling salita, ang DOM ay isang representasyon ng isang dokumento bilang isang puno ng mga tag. Binubuo ang punong ito ng isang nested na istraktura ng mga tag kasama ang mga fragment ng text ng page, na bawat isa ay bumubuo ng hiwalay na node.

    Ang pinakasimpleng DOM

    Buuin muna natin ang DOM tree para sa susunod na dokumento.

    Pamagat: Napakahusay na Dokumento

    Ang pinakalabas na tag ay , kaya ang puno ay nagsisimulang tumubo mula doon.

    Mayroong dalawang node sa loob: at - nagiging mga child node sila ng .

    Form ng mga tag mga node ng elemento(element node). Iniharap ang teksto mga node ng teksto(text node). Parehong pantay na node sa DOM tree.

    Mas kumplikadong halimbawa

    Tingnan natin ngayon ang isang mas mahalagang pahina:

    Tungkol sa moose Ang katotohanan tungkol sa moose.

  • Ang Elk ay isang tusong hayop
  • .. At mapanlinlang
  • Ang ugat na elemento ng hierarchy ay html. Mayroon siyang dalawang inapo. Ang una ay ang ulo, ang pangalawa ay ang katawan. At iba pa, ang bawat nested na tag ay anak ng tag sa itaas:

    Sa figure na ito, ang asul ay nagpapahiwatig ng mga elemento ng node, ang itim ay nagpapahiwatig ng mga elemento ng teksto.

    Ang puno ay nabuo ng mga asul na elemento ng node - mga HTML tag.

    At ito ang hitsura ng isang puno kung iguguhit mo ito nang direkta sa isang HTML na pahina:

    Sa pamamagitan ng paraan, ang puno sa figure na ito ay hindi isinasaalang-alang ang teksto na binubuo lamang ng mga character na whitespace. Halimbawa, ang naturang text node ay dapat na dumating kaagad pagkatapos ng . Tinatawag ang isang DOM na hindi naglalaman ng gayong "walang laman" na mga node "na-normalize".

    Tingnan natin ang isang bahagyang mas kumplikadong dokumento.

    Data ng Dokumento

    • Maingat
    • Impormasyon
    Ginawa sa Russia

    Ang nangungunang tag ay html, mayroon itong ulo at katawan ng mga bata, at iba pa. Nagreresulta ito sa isang tag tree:

    Mga Katangian

    Sa halimbawang ito, ang mga node ay may mga sumusunod na katangian: style , class , id . Sa pangkalahatan, ang mga katangian ay itinuturing din na mga node sa DOM na ang magulang ay ang elemento ng DOM kung saan ang mga ito ay tinukoy.

    Gayunpaman, sa web programming ay karaniwang hindi nila sinisilip ang jungle na ito, at isinasaalang-alang ang mga katangian bilang mga katangian lamang ng isang DOM node, na, tulad ng makikita natin sa ibang pagkakataon, ay maaaring itakda at baguhin sa kahilingan ng programmer.

    Sa totoo lang, ito ay isang lihim, ngunit ang DOCTYPE ay isa ring DOM node, at matatagpuan sa DOM tree sa kaliwa ng HTML (ang katotohanang ito ay nakatago sa larawan).

    P.S. Ito ay isang biro tungkol sa lihim, siyempre, ngunit hindi lahat ay talagang nakakaalam tungkol dito. Mahirap isipin kung saan maaaring maging kapaki-pakinabang ang gayong kaalaman...

    Normalization sa iba't ibang mga browser

    Kapag nag-parse ng HTML, agad na lumilikha ang Internet Explorer na-normalize DOM kung saan ang mga node ay hindi nilikha mula sa walang laman na text.

    Ang Firefox ay may ibang opinyon, lumilikha ito ng elemento ng DOM mula sa bawat fragment ng teksto.
    Samakatuwid, sa Firefox ang puno ng dokumentong ito ay ganito ang hitsura:

    Sa figure, para sa kaiklian, ang mga node ng teksto ay ipinahiwatig lamang ng isang hash. Ang katawan ay may 7 anak sa halip na 3.

    May ipagyayabang din ang Opera. Maaari siyang magdagdag ng karagdagang walang laman na elemento "mula lamang sa kanyang sarili."

    Upang makita ito, buksan ang dokumento. Ibinabalik nito ang bilang ng mga child node ng document.body , kabilang ang mga text node.

    Nakakuha ako ng 3 para sa IE, 7 para sa Firefox at 8 (!?) para sa Opera.

    Sa pagsasagawa, ang hindi pagkakatugma na ito ay hindi lumilikha ng malalaking problema, ngunit kailangan mong malaman ito. Halimbawa, ang pagkakaiba ay maaaring magpakita mismo sa kaso ng enumerating tree node.

    Ang mga posibilidad na ibinibigay ng DOM

    Bakit, bukod sa magagandang guhit, kailangan natin ng hierarchical DOM?

    Napakasimple:

    Ang bawat elemento ng DOM ay isang bagay at nagbibigay ng mga katangian para sa pagmamanipula ng mga nilalaman nito, para sa pag-access sa mga magulang at mga anak.

    Ginagamit ang object ng dokumento para sa pagmamanipula ng DOM.
    Gamit ang dokumento , maaari mong makuha ang nais na elemento ng puno at baguhin ang nilalaman nito.

    Halimbawa, nakukuha ng code na ito ang unang elemento na may ol na tag, nag-aalis ng dalawang elemento ng listahan nang sunud-sunod, at pagkatapos ay idaragdag ang mga ito sa reverse order:

    Var ol = document.getElementsByTagName("ol") var hiter = ol.removeChild(ol.firstChild) var kovaren = ol.removeChild(ol.firstChild) ol.appendChild(kovaren) ol.appendChild(hiter)

    Para sa isang halimbawa kung paano gumagana ang naturang script, mag-click sa teksto sa pahina ng moose

    Sa mga lumang tutorial at script, makikita mong direktang binago ang HTML code ng isang page sa pamamagitan ng pagtawag sa document.write .

    Sa modernong mga script, ang pamamaraang ito ay halos hindi ginagamit ang mga kaso ng tamang paggamit nito ay mabibilang sa isang banda.

    Iwasan ang document.write.. Maliban kung alam mo talaga ang iyong ginagawa (bakit ka nagbabasa ng tutorial noon - isa ka nang guro)

    Tingnan natin ang mga paraan ng pag-access at katangian ng mga elemento ng DOM.

    Pag-access sa mga elemento

    Ang lahat ng pag-access at pagbabago ng DOM ay nagmula sa object ng dokumento.

    Magsimula tayo sa tuktok ng puno.

    dokumento.documentElement

    Ang tuktok na tag. Sa kaso ng isang tamang HTML na pahina, ito ay magiging .

    dokumento.katawan

    Tag, kung naroroon sa dokumento (dapat).

    Ang sumusunod na halimbawa, kapag na-click ang isang button, ay gagawa ng representasyon ng text ng mga object.documentElement at document.body. Ang string mismo ay nakasalalay sa browser, kahit na ang mga bagay ay pareho sa lahat ng dako.

    function go() ( alert(document.documentElement) alert(document.body) )

    Mga uri ng elemento ng DOM

    Ang bawat elemento sa DOM ay may uri. Naka-store ang numero nito sa attribute na elem.nodeType

    Sa kabuuan, mayroong 12 uri ng mga elemento sa DOM.

    Karaniwang isa lang ang ginagamit: Node.ELEMENT_NODE, na ang bilang ay 1. Ang mga elemento ng ganitong uri ay tumutugma sa mga HTML tag.

    Minsan ay kapaki-pakinabang din ang uri ng Node.TEXT_NODE, na katumbas ng 3. Ito ay mga elemento ng teksto.

    Ang iba pang mga uri ay hindi ginagamit sa javascript programming.

    Ang sumusunod na halimbawa, kapag nag-click sa isang button, ay magpi-print ng mga uri ng document.documentElement at pagkatapos ay ang uri ng huling anak ng document.body node. Ito ay isang text node.

    function go() ( alert(document.documentElement.nodeType) alert(document.body.lastChild.nodeType) ) Text

    Halimbawa

    Halimbawa, ito ang magiging hitsura ng dokumento mula sa halimbawa sa itaas sa isang browser kung ang bawat nakikitang elemento ay napapalibutan ng isang frame na may numero ng nodeType sa kanang sulok sa itaas.

    ...Data

    • Maingat
    • Impormasyon
    Ginawa sa Russia

    Ang mga elemento lamang sa loob ng katawan ang ipinapakita dito, dahil sila lamang ang ipinapakita sa pahina. Para sa mga elemento ng uri 1 (mga tag), ang kaukulang tag ay ipinahiwatig sa mga bracket para sa mga elemento ng teksto (uri 3), mayroon lamang isang numero.

    Mga elemento ng bata
  • Ang lahat ng mga elemento ng bata, kabilang ang mga teksto, ay nasa hanay ng childNodes.

    Ang sumusunod na halimbawa ay umiikot sa lahat ng mga anak ng document.body .

    Para sa(var i=0; i BODY

    istilo

    Kinokontrol ng property na ito ang istilo. Ito ay katulad ng pagtatakda ng istilo sa CSS.

    Halimbawa, maaari mong itakda ang element.style.width:

    Source code para sa button na ito:

    Mayroong pangkalahatang tuntunin sa pagpapalit - kung ang isang katangian ng CSS ay may mga gitling, pagkatapos ay upang itakda ang estilo kailangan mong palitan ang mga ito ng malalaking titik.

    Halimbawa, para itakda ang z-index property sa 1000, kailangan mong itakda ang:

    Element.style.zIndex = 1000

    panloobHTML

    Sa isang pagkakataon ang property na ito ay sinusuportahan lamang sa IE. Ngayon sinusuportahan ito ng lahat ng modernong browser.

    Naglalaman ito ng lahat ng HTML code sa loob ng node at maaaring baguhin.

    Ang innerHTML property ay pangunahing ginagamit upang dynamic na baguhin ang content ng isang page, halimbawa:

    Document.getElementById("footer").innerHTML = "Bye!"

    Marahil ang innerHTML ay isa sa mga pinakakaraniwang ginagamit na katangian ng elemento ng DOM.

    pangalan ng klase

    Tinutukoy ng property na ito ang klase ng elemento. Ito ay ganap na katulad ng "class" na katangian ng html.

    Elem.className = "newclass"

    onclick, onkeypress, onfocus...

    At iba pang mga pag-aari na nagsisimula sa "on..." na mga function ng handler ng tindahan para sa mga kaukulang kaganapan. Halimbawa, maaari kang magtalaga ng onclick event handler.

    Para sa higit pang impormasyon tungkol sa mga pag-aari at tagapangasiwa ng kaganapan, tingnan