A fejlesztők általában akkor használják a jQuery-t, amikor valamit tenniük kell a DOM-mal. Azonban szinte bármilyen DOM-manipuláció elvégezhető tiszta JavaScript a DOM API használatával.

Nézzük meg ezt az API-t részletesebben:

A végén megírja saját egyszerű DOM-könyvtárát, amely bármilyen projektben használható.

DOM lekérdezések

A DOM-lekérdezések a .querySelector() metódussal készülnek, amely egy tetszőleges CSS-választót vesz fel argumentumként.

Const myElement = document.querySelector("#foo > div.bar")

Visszaadja az első egyező elemet. Megteheti az ellenkezőjét is – ellenőrizze, hogy egy elem egyezik-e egy szelektorral:

MyElement.matches("div.bar") === igaz

Ha meg szeretné kapni az összes olyan elemet, amely megfelel egy választónak, használja a következő konstrukciót:

Const myElements = document.querySelectorAll(.bar")

Ha tudja, hogy melyik szülőelemre kell hivatkozni, egyszerűen kereshet a gyermekei között, ahelyett, hogy a teljes kódban keresne:

Const myChildElemet = myElement.querySelector("input") // Ehelyett: // document.querySelector("#foo > div.bar bemenet")

Felmerül a kérdés: akkor miért használjunk más, kevésbé kényelmes módszereket, mint a.getElementsByTagName() ? Van egy kis probléma - az output.querySelector() eredménye nem frissül, és amikor hozzáadjuk új elem(lásd ), ez nem fog változni.

const elements1 = document.querySelectorAll("div") const elements2 = document.getElementsByTagName("div") const newElement = document.createElement("div") document.body.appendChild(newElement) elements1.length === elements2.length // hamis

A querySelectorAll() is mindent egy listába gyűjt, ami miatt nem túl hatékony.

Hogyan dolgozzunk listákkal?

Ezen túlmenően a .querySelectorAll() két apró furcsasággal rendelkezik. Nem lehet egyszerűen az eredmények alapján metódusokat hívni, és elvárni, hogy mindegyikre alkalmazzák őket (ahogyan a jQuery esetében megszokhattuk). Mindenesetre meg kell ismételnie a ciklus összes elemét. Másodszor, a visszaadott objektum elemek listája, nem tömb. Ezért a tömbmódszerek nem működnek. Természetesen vannak listákra vonatkozó metódusok, például a .forEach() , de sajnos nem minden esetben alkalmasak. Tehát jobb a listát tömbbé konvertálni:

// Array.from() Array.from(myElements) használata (myElements , doSomethingWithEachElement)

Minden elemnek van néhány tulajdonsága, amelyek egy "családra" utalnak.

MyElement.children myElement.firstElementChild myElement.lastElementChild myElement.previousElementSibling myElement.nextElementSibling

Mivel az elem interfész a csomóponti felülettől öröklődik, a következő tulajdonságok is jelen vannak:

MyElement.childNodes myElement.firstChild myElement.lastChild myElement.previousTestvér myElement.nextSibling myElement.parentNode myElement.parentElement

Az előbbi tulajdonságok az elemre vonatkoznak, míg az utóbbiak (a .parentElement kivételével) tetszőleges típusú elemek listái lehetnek. Ennek megfelelően ellenőrizheti az elem típusát:

MyElement.firstChild.nodeType === 3 // ez az elem szöveges csomópont lesz

Osztályok és attribútumok hozzáadása

Új osztály hozzáadása nagyon egyszerű:

myElement.classList.add("foo") myElement.classList.remove("bar") myElement.classList.toggle("baz")

Tulajdonság hozzáadása egy elemhez pontosan ugyanaz, mint bármely objektumhoz:

// A const value = myElement.value attribútum értékének lekérése // Az attribútum beállítása a myElement.value = "(!LANG:foo) elem tulajdonságaként" // Для установки нескольких свойств используйте.Object.assign() Object.assign(myElement, { value: "foo", id: "bar" }) // Удаление атрибута myElement.value = null !}

Használhatja a .getAttibute() , .setAttribute() és .removeAttribute() metódusokat. Azonnal megváltoztatják az elem HTML-attribútumait (szemben a DOM-tulajdonságokkal), ami a böngésző újrarenderelését indítja el (az esetleges változásokat megtekintheti, ha megvizsgálja az elemet a böngésző fejlesztői eszközeivel). Az ilyen újrarajzolások nemcsak több erőforrást igényelnek, mint a DOM-tulajdonságok beállítása, hanem váratlan hibákhoz is vezethetnek.

Általában olyan elemeken használatosak, amelyek nem rendelkeznek megfelelő DOM-tulajdonságokkal, például a colspan . Vagy ha valóban szükséges a használatuk, például a HTML tulajdonságokhoz öröklődéskor (lásd).

CSS-stílusok hozzáadása

Hozzáadásuk ugyanúgy történik, mint a többi tulajdonság:

MyElement.style.marginLeft = "2em"

Néhány bizonyos tulajdonságokat beállítható a .style segítségével, de ha néhány számítás után szeretné megkapni az értékeket, akkor jobb a window.getComputedStyle() használata. Ez a metódus veszi az elemet, és egy CSSStyleDeclaration-t ad vissza, amely magában foglalja az elem és a szülő stílusát is:

Window.getComputedStyle(myElement).getPropertyValue("margin-left")

A DOM megváltoztatása

Az elemeket áthelyezheti:

// Az elem1 hozzáadása az elem2 utolsó gyermekeként elem1.appendChild(elem2) // Az elem2 beillesztése az elem1 gyermekeként az elem3 elé elem1.insertBefore(elem2, elem3)

Ha nem szeretne áthelyezni, de be kell illesztenie egy másolatot, használja:

// Klón létrehozása const myElementClone = myElement.cloneNode() myParentElement.appendChild(myElementClone)

A .cloneNode() metódus logikai értéket vesz fel argumentumként, és ha igaz , akkor klónoz és gyermek elemek.

Természetesen új elemeket is létrehozhat:

const myNewElement = document.createElement("div") const myNewTextNode = document.createTextNode("némi szöveg")

Ezután helyezze be őket a fent látható módon. Egy elemet közvetlenül nem törölhet, de a szülőelemen keresztül megteheti:

MyParentElement.removeChild(myElement)

Közvetetten is hivatkozhat:

MyElement.parentNode.removeChild(myElement)

Módszerek az elemeken

Minden elem rendelkezik olyan tulajdonságokkal, mint az .innerHTML és a .textContent , ezek tartalmazzák a HTML kódot és ennek megfelelően magát a szöveget is. A következő példa megváltoztatja egy elem tartalmát:

// A HTML módosítása myElement.innerHTML = `

új tartalom

beep boop beep boop

` // Ezzel eltávolítja a tartalmat myElement.innerHTML = null // Hozzáadás a HTML-hez myElement.innerHTML += ` olvasás folytatása...

Valójában a HTML megváltoztatása rossz ötlet, mert elveszíti az összes korábban végrehajtott módosítást, és túlterheli az eseménykezelőket is. Jobb ezt a módszert csak úgy használni, ha teljesen eldobja az összes HTML-t, és lecseréli egy másolatra a szerverről. Mint ez:

const link = document.createElement("a") const text = document.createTextNode("olvasás folytatása...") const hr = document.createElement("hr") link.href = "foo.html" link.appendChild( text) myElement.appendChild(link) myElement.appendChild(hr)

Ez azonban két böngésző újrarajzolást eredményez, míg az .innerHTML csak egyet. Ezt megkerülheti, ha először mindent hozzáad a DocumentFragmenthez, majd hozzáadja a szükséges töredéket:

Const fragment = document.createDocumentFragment() fragment.appendChild(text) fragment.appendChild(hr) myElement.appendChild(fragment)

Eseménykezelők

Az egyik legegyszerűbb kezelő:

MyElement.onclick = függvény onclick (esemény) ( console.log(event.type + " kirúgva") )

De általános szabályként ezt kerülni kell. Itt az .onclick az elem tulajdonsága, és elméletileg megváltoztatható, de nem tud további kezelőket hozzáadni egy másik, a régire hivatkozó függvény használatával.

A kezelők hozzáadásához jobb az .addEventListener() használata. Három argumentumra van szükség: egy eseménytípusra, egy függvényre, amely minden aktiválódáskor meghívódik, és egy konfigurációs objektumra (erre később térünk ki).

MyElement.addEventListener("kattintás", függvény (esemény) ( console.log(event.type + " kirúgva") )) myElement.addEventListener("kattintás", függvény (event) ( console.log(event.type + " megint kirúgtak")))

Az event.target tulajdonság arra az elemre utal, amelyhez az esemény kapcsolódik.

Így hozzáférhet az összes tulajdonsághoz:

// A `forms` tulajdonság az összes űrlapra mutató hivatkozásokat tartalmazó tömb const myForm = document.forms const myInputElements = myForm.querySelectorAll("input") Array.from(myInputElements).forEach(el => ( el.addEventListener(") change ", function (event) ( console.log(event.target.value) )) ))

Az alapértelmezett műveletek megakadályozása

Ehhez a .preventDefault() metódust használjuk, amely blokkolja a szabványos műveleteket. Például blokkolja az űrlap elküldését, ha az ügyféloldali hitelesítés nem volt sikeres:

MyForm.addEventListener("submit", függvény (esemény) ( const name = this.querySelector("#name") if (name.value === "(!LANG:Donald Duck") { alert("You gotta be kidding!") event.preventDefault() } }) !}

A .stopPropagation() metódus akkor segít, ha van egy adott eseménykezelő a gyermekhez, és egy második kezelő ugyanahhoz az eseményhez a szülőhöz.

Ahogy korábban említettük, az .addEventListener() metódus egy opcionális harmadik argumentumot vesz fel konfigurációs objektumként. Ennek az objektumnak tartalmaznia kell a következő logikai tulajdonságok bármelyikét (alapértelmezés szerint mindegyik false):

  • rögzítés: az esemény ehhez az elemhez lesz csatolva a DOM bármely más eleme előtt;
  • egyszer: Egy eseményt csak egyszer lehet rögzíteni.
  • passzív: az event.preventDefault() figyelmen kívül lesz hagyva (kivétel hiba esetén).

A legáltalánosabb tulajdonság a .capture, és annyira elterjedt, hogy van rá egy rövidítés: ahelyett, hogy egy konfigurációs objektumban adná át, egyszerűen adja meg az értékét itt:

MyElement.addEventListener(típus, figyelő, igaz)

A kezelők eltávolítása a .removeEventListener() metódussal történik, amelyhez két argumentum szükséges: az eseménytípus és az eltávolítandó kezelőre való hivatkozás. Például az egyszeri tulajdonság a következőképpen valósítható meg:

MyElement.addEventListener("módosítás", függvényfigyelő (esemény) ( console.log(event.type + " aktiválva lett " + this) this.removeEventListener("módosítás", figyelő) ))

Öröklés

Tegyük fel, hogy van egy eleme, és eseménykezelőt szeretne hozzáadni az összes alárendelt eleméhez. Ezután a fent látható módon a myForm.querySelectorAll("input") metódussal kell végigfutnia rajtuk. Azonban egyszerűen hozzáadhat elemeket az űrlaphoz, és ellenőrizheti azok tartalmát az event.target segítségével.

MyForm.addEventListener("módosítás", függvény (event) ( const target = event.target if (target.matches("input")) ( console.log(target.value) ) ))

A módszer további előnye, hogy a kezelő automatikusan hozzá lesz kapcsolva az új gyermekelemekhez.

Élénkség

Az animáció hozzáadásának legegyszerűbb módja a CSS használata az átmeneti tulajdonsággal. De a nagyobb rugalmasság érdekében (például egy játékhoz) a JavaScript jobban megfelel.

A window.setTimeout() metódus meghívása az animáció befejezéséig nem jó ötlet, mivel az alkalmazás lefagyhat, különösen mobileszközökön. Jobb, ha a window.requestAnimationFrame() függvényt használod az összes változtatás mentéséhez a következő újrarajzolásig. Egy függvényt vesz fel argumentumként, amely viszont kap egy időbélyeget:

const start = window.performance.now() const időtartama = 2000 window.requestAnimationFrame(függvény fadeIn (now)) ( const progress = most - start myElement.style.opacity = előrehaladás / időtartam if (haladás)< duration) { window.requestAnimationFrame(fadeIn) } }

Ily módon nagyon sima animáció érhető el. Mark Brown cikkében ezt a témát tárgyalja.

Saját könyvtárunk írása

Az a tény, hogy a DOM-ban állandóan át kell iterálni az elemeket, hogy valamit csináljunk velük, elég fárasztónak tűnhet a jQuery $(.foo").css((szín: "red")) szintaxisához képest. De miért nem ír néhány saját módszert, hogy megkönnyítse ezt a feladatot?

Const $ = függvény $(választó, kontextus = dokumentum) ( const elements = Array.from(context.querySelectorAll(selector)) return ( elements, html (newHtml) ( this.elements.forEach(element => ( element.innerHTML =) newHtml )) return this ), css (newCss) ( this.elements.forEach(element => ( Object.assign(element.style, newCss) )) return this ), on (esemény, kezelő, opciók) ( this.elements .forEach(elem => ( element.addEventListener(esemény, kezelő, opciók) )) ezt adja vissza ) ) )

Pszeudokód

$(".rightArrow").click(function() ( rightArrowParents = this.dom(); //.dom(); a pszeudofüggvény ... a teljes figyelmeztetést kell mutatnia(rightArrowParents); ));

A riasztási üzenet a következő lesz:

body div.lol a.rightArrow

Hogyan érhetem el ezt a javascript/jquery segítségével?

A jQuery ilyen használata (ezt egy olyan megoldás követi, amely nem használja a jQuery-t, kivéve az eseményt, sokkal kevesebb függvényhívást, ha ez számít):

Valós idejű példa:

$(".jobbra nyíl").click(function() ( var rightArrowParents = ; $(this).parents().addBack().not("html").each(function() ( var bejegyzés = this.tagName .toLowerCase(); if (this.className) ( bejegyzés += "." + this.className.replace(/ /g, "."); ) rightArrowParents.push(entry); )); alert(rightArrowParents.join (" ")); hamis visszaküldés; ));

kattints ide

(Az élő példákban frissítettem a div osztály attribútumát lol multira, hogy bemutassam több osztály kezelését.)

Itt van egy megoldás a pontos elemillesztésre.

Fontos megérteni, hogy a választó (nem valós), amelyet a Chrome Tools mutat, nem azonosítja egyértelműen a DOM elemeit. ( , például nem tesz különbséget az egymást követő span elemek listája között. Nincs pozícionálási/indexelési információ)

$.fn.fullSelector = függvény () ( var elérési út = this.parents().addBack(); var quickCss = path.get().map(function (elem) ( var self = $(elem), id = elem .id ? "#" + item.id: "", clss = item.classList.length ? item.classList.toString().split(" ").map(function (c) ( return "." + c; )).join("") : "", név = item.nodeName.toLowerCase(), index = self.siblings(name).length ? ":nth-child(" + (self.index() + 1) + ")" : ""; if (név === "html" || név === "test") ( visszatérési név; ) visszatérési név + index + azonosító + clss; )).join(" > ") ; return quickCss; );

És így használhatod:

Console.log($("some-selector").fullSelector());

Áthelyeztem a részletet T.J. Crowder egy apró jQuery beépülő modulhoz. Én a jQuery verziót használtam, még ha igaza is van teljesen felesleges rezsi, de csak hibakeresésre használom így nem érdekel.

Használat:

beágyazott fesztáv
egyszerű fesztáv
Elő

// eredmény (tömb): ["body", "div.sampleClass"] $("span").getDomPath(false) // eredmény (karakterlánc): body > div.sampleClass $("span").getDomPath( ) // eredmény (tömb): ["body", "div#test"] $("pre").getDomPath(false) // eredmény (karakterlánc): body > div#test $("pre").getDomPath ()

var obj = $("#show-editor-button"), elérési út = ""; while (typeof obj.prop("tagName") != "undefined")( if (obj.attr("osztály"))( elérési út = "."+obj.attr("osztály").replace(/\s /g , ".") + elérési út; ) if (obj.attr("id"))( elérési út = "#"+obj.attr("id") + elérési út; ) path = " " +obj.prop( "tagName").toLowerCase() + elérési út; obj = obj.parent(); ) console.log(elérési út);

hello, ez a függvény egy olyan hibát old meg, amely azzal kapcsolatos, hogy az aktuális elem nem jelenik meg az elérési útban

Nézze meg most

$j(".wrapper").click(function(event) ( selectedElement=$j(event.target); var rightArrowParents = ; $j(event.target).parents().not("html,body") .each(function() ( var bejegyzés = this.tagName.toLowerCase(); if (this.className) ( bejegyzés += "." + this.className.replace(/ /g, "."); )else if (this.id)( entry += "#" + this.id; ) entry=ReplaceAll(entry,"..","."); rightArrowParents.push(entry); )); rightArrowParents.reverse(); //if(event.target.nodeName.toLowerCase()=="a" || event.target.nodeName.toLowerCase()=="h1")( var entry = event.target.nodeName.toLowerCase(); if (event.target.className) ( bejegyzés += "." + event.target.className.replace(/ /g, "."); )else if(event.target.id)( bejegyzés += "#" + event.target.id; ) rightArrowParents.push(entry); // )

Ahol $j = jQuery változó

is oldja meg a problémát a .. osztálynévben

itt van a csere funkció:

Függvény escapeRegExp(str) ( return str.replace(/([.*+?^=!:$()()|\[\]\/\\])/g, "\\$1"); ) függvény csereAll(str, keresés, csere) ( return str.replace(new RegExp(escapeRegExp(find), "g"), csere); )

Itt van egy natív JS-verzió, amely visszaadja a jQuery elérési utat. Az elemek azonosítóit is hozzáadom, ha vannak. Ez megadja a lehetőséget, hogy a legrövidebb utat válassza, ha látja az azonosítót a tömbben.

varpath = getDomPath(elem); console.log(path.join(" > "));

Body > section:eq(0) > div:eq(3) > section#content > section#firehose > div#firehoselist > article#firehose-46813651 > header > h2 > span#title-46813651

Itt van a funkció.

Függvény getDomPath(el) ( var verem = ; while (el.parentNode != null) ( console.log(el.nodeName); var sibCount = 0; var sibIndex = 0; for (var i = 0; i< el.parentNode.childNodes.length; i++) { var sib = el.parentNode.childNodes[i]; if (sib.nodeName == el.nodeName) { if (sib === el) { sibIndex = sibCount; } sibCount++; } } if (el.hasAttribute("id") && el.id != "") { stack.unshift(el.nodeName.toLowerCase() + "#" + el.id); } else if (sibCount >1) ( stack.unshift(el.nodeName.toLowerCase() + ":eq(" + sibIndex + ")"); ) else ( stack.unshift(el.nodeName.toLowerCase()); ) el = el.parentNode ; ) return stack.slice(1); // eltávolítja a html elemet )

Az összetett és nehéz webes alkalmazások manapság általánossá váltak. A böngészőkön átívelő és könnyen használható könyvtárak, mint például a jQuery, széles funkcionalitásukkal nagyban segíthetik a DOM-manipulációt menet közben. Ezért nem meglepő, hogy sok fejlesztő gyakrabban használja az ilyen könyvtárakat, mint a natív DOM API-val, amivel sok probléma volt. És bár a böngészők közötti különbségek továbbra is problémát jelentenek, a DOM jelenleg jobb állapotban van, mint 5-6 évvel ezelőtt, amikor a jQuery egyre népszerűbb volt.

Ebben a cikkben bemutatom a DOM azon képességét, hogy manipulálja a HTML-t, a szülő, gyermek és szomszéd kapcsolatokra összpontosítva. Befejezésül a böngésző támogatásának részletezésével fejezem be ezeket a funkciókat, de ne feledje, hogy a jQuery típusú könyvtár továbbra is jó választás a hibák és a natív funkciók megvalósításának következetlenségei miatt.

Gyermek csomópontok számolása

A bemutatóhoz a következő HTML-jelölést fogom használni, és a cikkben többször módosítani fogom:

  • Egy példa
  • példa kettő
  • példa három
  • példa négy
  • ötös példa
  • Hat példa

Var myList = document.getElementById("myList"); console.log(myList.children.length); // 6 console.log(myList.childElementCount); 6

Mint látható, az eredmények ugyanazok, bár az alkalmazott technikák eltérőek. Az első esetben a gyermekek tulajdonát használom. Ez egy csak olvasható tulajdonság, és egy gyűjteményt ad vissza HTML elemek, amely a kért elemen belül található; számuk megszámlálásához ennek a gyűjteménynek a long tulajdonságát használom.

A második példában a childElementCount metódust használom, amely szerintem rendezettebb és potenciálisan jobban karbantartható (erről később, nem hiszem, hogy gondot okozna megérteni, mit csinál).

Megpróbálhatnám a childNodes.length használatát (a children.length helyett), de nézd meg az eredményt:

Var myList = document.getElementById("myList"); console.log(myList.childNodes.length); 13

13-at ad vissza, mivel a childNodes az összes csomópont gyűjteménye, beleértve a szóközöket – ezt tartsa szem előtt, ha érdekli a gyermek csomópontok és a gyermekelem csomópontok közötti különbség.

Gyermek csomópontok meglétének ellenőrzése

A hasChildNodes() metódussal ellenőrizhető, hogy egy elemnek vannak-e gyermekcsomópontjai. A metódus visszatér logikai érték jelenlétük vagy hiányuk jelzése:

Var myList = document.getElementById("myList"); console.log(myList.hasChildNodes()); // igaz

Tudom, hogy a listámnak gyermekcsomópontjai vannak, de meg tudom változtatni a HTML-t, hogy ne legyen; most így néz ki a jelölés:

És itt van a hasChildNodes() ismételt futtatásának eredménye:

Console.log(myList.hasChildNodes()); // igaz

A metódus továbbra is igazat ad vissza. A lista ugyan nem tartalmaz elemeket, de tartalmaz szóközt, ami egy érvényes csomóponttípus. Ez a módszer minden csomópontot figyelembe vesz, nem csak elemcsomópontokat. Ahhoz, hogy a hasChildNodes() hamis értéket adjon vissza, ismét módosítanunk kell a jelölést:

És most a várt eredmény megjelenik a konzolon:

Console.log(myList.hasChildNodes()); // hamis

Természetesen, ha tudom, hogy szóközzel találkozhatok, először ellenőrzöm a gyermek csomópontok létezését, majd a nodeType tulajdonság segítségével megállapítom, hogy vannak-e közöttük elemcsomópontok.

Gyermekelemek hozzáadása és eltávolítása

Vannak olyan technikák, amelyekkel elemeket lehet hozzáadni és eltávolítani a DOM-ból. Ezek közül a leghíresebb a createElement() és az appendChild() metódusok kombinációján alapul.

VarmyEl = document.createElement("div"); document.body.appendChild(myEl);

Ebben az esetben én alkotok

a createElement() metódus használatával, majd hozzáadva a törzshöz. Nagyon egyszerű, és valószínűleg már használta ezt a technikát.

De egy speciálisan kialakított elem beszúrása helyett használhatom az appendChild()-et is, és egyszerűen áthelyezhetem a meglévő elemet. Tegyük fel, hogy a következő jelöléssel rendelkezünk:

  • Egy példa
  • példa kettő
  • példa három
  • példa négy
  • ötös példa
  • Hat példa

példa szöveg

A lista helyét a következő kóddal tudom megváltoztatni:

Var myList = document.getElementById("myList"), konténer = document.getElementById("c"); container.appendChild(myList);

A végső DOM így fog kinézni:

példa szöveg

  • Egy példa
  • példa kettő
  • példa három
  • példa négy
  • ötös példa
  • Hat példa

Vegye figyelembe, hogy a teljes listát eltávolítottuk a helyéről (a bekezdés felett), majd beszúrtuk utána, a záró törzs elé. Míg az appendChild() metódust általában a createElement() segítségével létrehozott elemek hozzáadására használják, a meglévő elemek áthelyezésére is használható.

Teljesen eltávolíthatok egy gyermek elemet a DOM-ból a removeChild() segítségével. A listánk eltávolítása az előző példából:

Var myList = document.getElementById("myList"), konténer = document.getElementById("c"); container.removeChild(myList);

Az elemet eltávolították. A removeChild() metódus visszaadja az eltávolított elemet, és el tudom tárolni, ha később szükségem lesz rá.

Var myOldChild = document.body.removeChild(myList); document.body.appendChild(myOldChild);

Létezik a ChildNode.remove() metódus is, amelyet viszonylag nemrégiben adtak hozzá a specifikációhoz:

Var myList = document.getElementById("myList"); myList.remove();

Ez a módszer nem ad vissza távoli objektumot, és nem működik IE-ben (csak Edge). Mindkét módszer ugyanúgy távolítja el a szövegcsomópontokat, mint az elemcsomópontokat.

Gyermek elemek cseréje

Egy meglévő gyermekelemet lecserélhetek egy újra, függetlenül attól, hogy az új elem létezik, vagy én hoztam létre a semmiből. Íme a jelölés:

példaszöveg

Var myPar = document.getElementById("par"), myDiv = document.createElement("div"); myDiv.className = "példa"; myDiv.appendChild(document.createTextNode("Új elem szövege")); document.body.replaceChild(myDiv, myPar);

Új elem szövege

Mint látható, a changeChild() metódus két argumentumot használ: az új elemet és a régi elemet, amelyet lecserél.

Ezzel a módszerrel egy meglévő elemet is áthelyezhetek. Vessen egy pillantást a következő HTML-re:

példa szöveg 1

példa szöveg 2

példa szöveg 3

A harmadik bekezdést az első bekezdéssel helyettesíthetem a következő kóddal:

Var myPar1 = document.getElementById("par1"), myPar3 = document.getElementById("par3"); document.body.replaceChild(myPar1, myPar3);

Most a generált DOM így néz ki:

példa szöveg 2

példa szöveg 1

Adott gyermekelemek kiválasztása

Több is van különböző utak egy adott elem kiválasztása. Ahogy korábban bemutattuk, kezdhetem a gyermekgyűjtemény vagy a childNodes tulajdonság használatával. De nézzünk más lehetőségeket is:

A firstElementChild és lastElementChild tulajdonságok pontosan azt teszik, amit a nevüktől elvárunk: jelölje ki az első és az utolsó gyermekelemet. Térjünk vissza a jelölésünkhöz:

  • Egy példa
  • példa kettő
  • példa három
  • példa négy
  • ötös példa
  • Hat példa

Az első és az utolsó elemet ezekkel a tulajdonságokkal tudom kiválasztani:

Var myList = document.getElementById("myList"); console.log(myList.firstElementChild.innerHTML); // "Egy példa" console.log(myList.lastElementChild.innerHTML); // "hatos példa"

Használhatom a previousElementSibling és nextElementSibling tulajdonságokat is, ha az elsőtől vagy az utolsótól eltérő gyermekelemeket akarok kijelölni. Ez a firstElementChild és lastElementChild tulajdonságok kombinálásával történik:

Var myList = document.getElementById("myList"); console.log(myList.firstElementChild.nextElementSibling.innerHTML); // "Kettes példa" console.log(myList.lastElementChild.previousElementSibling.innerHTML); // "Ötös példa"

Hasonló tulajdonságok is léteznek firstChild , lastChild , previousSibling és nextSibling , de ezek minden csomóponttípust figyelembe vesznek, nem csak az elemeket. Általában azok a tulajdonságok, amelyek csak elemcsomópontokat vesznek figyelembe, hasznosabbak, mint azok, amelyek az összes csomópontot kijelölik.

Tartalom beillesztése a DOM-ba

Már megvizsgáltam, hogyan lehet elemeket beilleszteni a DOM-ba. Térjünk át egy hasonló témára, és vessünk egy pillantást a tartalom beszúrásának új funkcióira.

Először is létezik az egyszerű insertBefore() metódus, amely nagyon hasonlít a changeChild() -hez, két argumentumot vesz fel, és működik az új és a meglévő elemeken is. Íme a jelölés:

  • Egy példa
  • példa kettő
  • példa három
  • példa négy
  • ötös példa
  • Hat példa

Példa bekezdés

Figyeld meg a bekezdést, először eltávolítom, majd beszúrom a lista elé, mindezt egy csapásra:

Var myList = document.getElementById("myList"), tároló = document.getElementBy("c"), myPar = document.getElementById("par"); container.insertBefore(myPar, myList);

Az eredményül kapott HTML-ben a bekezdés a lista elé kerül, és ez egy másik módja az elem tördelésének.

Példa bekezdés

  • Egy példa
  • példa kettő
  • példa három
  • példa négy
  • ötös példa
  • Hat példa

A changeChild()-hez hasonlóan az insertBefore() két argumentumot vesz fel: a hozzáadandó elemet és azt az elemet, amely elé be akarjuk szúrni.

Ez a módszer egyszerű. Most próbáljunk meg egy hatékonyabb beszúrási módot: az insertAdjacentHTML() metódust.