Ovo je četvrti dio postova posvećenih izvornim ekvivalentima jQuery metoda. Možda biste željeli ovo pročitati prije nego što nastavite.
U ovom članku ćemo pogledati načine za kreiranje, umetanje, premještanje i brisanje elemenata. I iako jQuery već sadrži veliki broj korisnim metodama, iznenadit ćete se kada saznate da se sve ovo može lako uraditi korištenjem prirodnih metoda.
Napomena: 'beforebegin' i 'afterend' će raditi samo ako je referentniNode u DOM stablu i ima roditeljski element.
Pogledajte sljedeće:
ReferenceNode.insertAdjacentElement(pozicija, čvor);
Metoda insertAdjacentElement uzima dva parametra:
Metoda insertAdjacentElement je čistija i intuitivnija od metode insertBefore, ali je ova druga bolje podržana u starijim pretraživačima.
Također je vrijedno napomenuti da će dodavanje elementa čvoru koji se nalazi u DOM stablu dovesti do ponovnog crtanja. Ovo nije baš dobro jer pretraživač mora ponovo izračunati veličinu i poziciju novog elementa, što će takođe dovesti do promena na potomcima, precima elementa i elementima koji se pojavljuju nakon njega u DOM-u. Ako dodajete mnogo elemenata u DOM, ovo može potrajati.
Da biste to izbjegli, možete ga dodati pomoću DocumentFragmenta. Fragment dokumenta je objekt dokumenta koji postoji samo u memoriji, tako da dodavanje u njega neće uzrokovati nikakvo ponovno postavljanje.
Recimo da trebamo dodati 100 li elemenata elementu ul koji je prisutan u DOM stablu:
// Dobivamo element koji će sadržavati naše stavke var ul = document.querySelector("ul"); // napravimo 100 elemenata liste za (var i = 1; i< 100; i++) { var li = document.createElement("li"); // append the new list element to the ul element ul.appendChild(li); }
U gornjem primjeru, li elementi se dodaju direktno elementu ul, koji se nalazi u DOM stablu, stoga će rezultirati ponovnim crtanjem na svakoj iteraciji - to je 100 promjena!
Hajde da nađemo bolji način.
// Dobivamo element koji će sadržavati naše stavke var ul = document.querySelector("ul"); // kreiramo fragment dokumenta za dodavanje elemenata liste u var docFrag = document.createDocumentFragment(); // napravimo 100 elemenata liste za (var i = 1; i< 100; i++) { var li = document.createElement("li"); // append the new list element to the fragment docFrag.appendChild(li); } // append the fragment to the ul element ul.appendChild(docFrag);
U istom primjeru, li elementi se dodaju fragmentu dokumenta u memoriji, tako da će se reflow pokrenuti kada se fragment doda elementu ul. Ova metoda će smanjiti broj ponovnih crtanja sa 100 na 1.
var element = document.getElementById("ElementToAppendAfter"); var newElement = document.createElement("div"); var elementParent = element.parentNode;Korak 1. Pripremite elemente:
elementParent.insertBefore(newElement, element.nextSibling);Korak 2. Dodajte nakon:
JavaScript ima insertBefore(), ali kako mogu umetnuti element poslije drugi element bez korištenja jQueryja ili druge biblioteke?
dodati:
Element.parentNode.insertBefore(newElement, element);
Dodaj nakon:
Element.parentNode.insertBefore(newElement, element.nextSibling);
Kreiranjem sljedećih prototipova, moći ćete pozvati ovu funkciju direktno iz novokreiranih elemenata.
newElement.appendBefore(element);
newElement.appendAfter(element);
.appendBefore(element) Prototip
Element.prototype.appendBefore = funkcija (element) ( element.parentNode.insertBefore(ovo, element); ),false;
.appendAfter(element)Prototype
Element.prototype.appendAfter = funkcija (element) ( element.parentNode.insertBefore(ovo, element.nextSibling); ),false;
/* Dodaje element PRIJE NeighborElementa */ Element.prototype.appendBefore = function(element) ( element.parentNode.insertBefore(ovo, element); ), false; /* Dodaje element NAKON NeighborElementa */ Element.prototype.appendAfter = function(element) (element.parentNode.insertBefore(this, element.nextSibling); ), false; /* Tipično kreiranje i postavljanje novog objekta bez roditelja */ var NewElement = document.createElement("div"); NewElement.innerHTML = "Novi element"; NewElement.id = "NoviElement"; /* Dodaj NewElement PRIJE -ILI- NAKON upotrebe gore navedenih prototipova */ NewElement.appendAfter(document.getElementById("Neighbor2"));
Komšija 3
Vraća novi čvor
Ekstenzija čvora
Node.prototype.insertAfter = function(čvor, referentniČvor) ( if (čvor) this.insertBefore(čvor, referentniČvor && referenceNode.nextSibling); povratni čvor; );
Jedan opšti primjer
Node.parentNode.insertAfter(newNode, node);
// Prvo proširi Node.prototype.insertAfter = function(čvor, referentniČvor) ( if (čvor) this.insertBefore(čvor, referentniČvor && referenceNode.nextSibling); return node; ); var referenceNode, newNode; newNode = document.createElement("li") newNode.innerText = "Prva nova stavka"; newNode.style.color = "#FF0000"; document.getElementById("bez djece").insertAfter(newNode); newNode = document.createElement("li"); newNode.innerText = "Druga nova stavka"; newNode.style.color = "#FF0000"; document.getElementById("no-reference-node").insertAfter(newNode); referenceNode = document.getElementById("no-sibling-after"); newNode = document.createElement("li"); newNode.innerText = "Treća nova stavka"; newNode.style.color = "#FF0000"; referenceNode.parentNode.insertAfter(newNode, referenceNode); referenceNode = document.getElementById("sibling-after"); newNode = document.createElement("li"); newNode.innerText = "Četvrta nova stavka"; newNode.style.color = "#FF0000"; referenceNode.parentNode.insertAfter(newNode, referenceNode);
Metoda insertBefore() se koristi kao parentNode.insertBefore() . Dakle, da bismo emulirali ovo i napravili metodu parentNode.insertAfter(), možemo napisati sljedeći kod.
Node.prototype.insertAfter = function(newNode, referenceNode) (vrati referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling); // zasnovano na karim79-ovom rješenju ); // dobivanje potrebnih ručki var refElem = document.getElementById(" pTwo"); var parent = refElem.parentNode; // kreiranje
stav tri
var txt = document.createTextNode("paragraf tri"); var paragraf = document.createElement("p"); paragraf.appendChild(txt); // sada ga možemo nazvati na isti način kao insertBefore() parent.insertAfter(paragraph, refElem);
stav jedan
stav dva
Imajte na umu da proširenje DOM-a možda nije pravo rješenje za vas, kao što je navedeno u ovom članku.
Međutim, ovaj članak je napisan 2010. godine i sada stvari mogu biti drugačije. Zato odlučite sami.
Omogućava vam rukovanje svim scenarijima
Funkcija insertAfter(newNode, referenceNode) ( if(referenceNode && referenceNode.nextSibling && referenceNode.nextSibling.nodeName == "#text") referenceNode = referenceNode.nextSibling; if(!referenceNode) document.body.appendChild else(newNode); (!referenceNode.nextSibling) document.body.appendChild(newNode else referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling);
Ovaj kod radi na umetanju elementa veze odmah nakon posljednjeg postojećeg podređenog umetanja kako bi se umetnuo mali css fajl
Var raf, cb=function())( //kreiraj novi čvor var link=document.createElement("link"); link.rel="stylesheet";link.type="text/css";link.href="css / style.css"; //insert iza zadnjeg čvora var nodes=document.getElementsByTagName("link"); //postojeći čvorovi var lastnode=document.getElementsByTagName("link"); lastnode.parentNode.insertBefore(link, lastnode. nextSibling ); //provjera prije umetanja pokušaj ( raf=requestAnimationFrame|| mozRequestAnimationFrame|| webkitRequestAnimationFrame|| msRequestAnimationFrame; ) catch(err)( raf=false; ) if (raf)raf(cb); else window.addEventListener("load",cb);
Znam da već postoji previše odgovora na ovo pitanje, ali nijedan od njih nije zadovoljio moje tačne zahtjeve.
Trebam funkciju koja ima potpuno suprotno ponašanje od parentNode.insertBefore- to jest, trebao bi prihvatiti null referenceNode (koji nije prihvaćen kao odgovor) i gdje će insertBefore umetnuti u kraj insertBefore u koji treba da ubaci početak, jer inače ne bi bilo načina da se zalijepi na originalnu lokaciju s ovom funkcijom; iz istog razloga insertBefore umeće na kraju.
Budući da nulti referentniNode zahtijeva od vas da insertBefore roditelj, moramo znati roditelj - insertBefore je metoda parentNode , tako da ima pristup roditeljskom parentNode na taj način; naša funkcija ne postoji, tako da moramo proslijediti roditeljski element kao parametar.
Rezultirajuća funkcija izgleda ovako:
Funkcija insertAfter(parentNode, newNode, referenceNode) (parentNode.insertBefore(newNode, referenceNode ? referenceNode.nextSibling: parentNode.firstChild); )
If (! Node.prototype.insertAfter) ( Node.prototype.insertAfter = funkcija (noviČvor, referentniČvor) ( this.insertBefore(newNode, referenceNode ? referenceNode.nextSibling: this.firstChild); ); )
node1.after(node2) kreira
gdje su čvor1 i čvor2 DOM čvorovi.
U ovom postu želim da vam kažem kako da dodate ili uklonite element iz objekta u JavaScript-u. Vrlo je jednostavno, ali mnogi početnici, poput mene prije, često se zbune oko toga.
Imamo jednostavan objekt koji sadrži podatke kao što su ime, prezime i web stranica. Podaci mogu biti apsolutno bilo koji, ali za potrebe ovog posta bit će upravo to.
Kod iznad je jasan, ali samo da pojasnimo: objektu možete dodati nove vrijednosti u sintaksi objekta koristeći "." i ključ ili uobičajeni format niza. Ako ga deklarirate kao niz, tada je obj i dalje objekt, jer ste ga prethodno tako označili zahvaljujući () .
Sada dodajmo neke podatke tamo:
Obj.other_obj.first = "prvi ključ novog objekta"; obj.other_obj.second = "drugi";
Napravili smo dvije nove vrijednosti, prvu i drugu, unutar other_obj.
Možete koristiti delete, koji može ukloniti elemente iz objekata. Ne možete izbrisati cijeli objekt na ovaj način, ali ako je potrebno, možete učiniti sljedeće:
Obj = (); // Ponovo čini objekt praznim
To je sve, ako i dalje imate pitanja o objektima u JavaScript-u, napišite komentar ispod, pokušaću da vam pomognem.
U ovoj lekciji ćemo naučiti kako kreirati čvorove elementa (createElement) i tekstualne čvorove (createTextNode). Takođe ćemo razmotriti metode dizajnirane za dodavanje čvorova u stablo (appendChild, insertBefore) i za uklanjanje čvorova iz stabla (removeChild).
Dodavanje novog čvora stablu obično se izvodi u 2 faze:
na primjer:
Razmotrimo složeniji primjer u kojem stablu dodajemo LI čvor koji sadrži tekstualni čvor sa tekstom "Smartphone" na kraju ul liste.
Da biste to uradili potrebno je da uradite sledeće:
Rad sa postojećim čvorovima pomoću metoda appendChild() i insertBefore() također se izvodi u 2 faze:
Na primjer, dodajte postojeći element li koji sadrži tekst "Tablet" na početak liste (ovo će ga ukloniti sa prethodnog mjesta):
//dobijamo UL element koji sadrži listu po svom ID-u var elementUL = document.getElementById("list"); //dobijamo element li koji sadrži tekstualni čvor "Tablet" var elementLI = elementUL.childNodes; //dodavanje elementa na početak liste //u ovom slučaju će biti uklonjen sa svoje originalne lokacije elementUL.insertBefore(elementLI,elementUL.firstChild);
Uklanjanje čvora sa stabla izvodi se u 2 faze:
//pronađimo čvor koji želimo da izbrišemo var findElement = document.getElementById("notebook"); //pozovite metodu removeChild na roditeljskom čvoru //i proslijedite mu pronađeni čvor kao parametar findElement.parentNode.removeChild(findElement);
Na primjer, uklonite posljednji podređeni element elementa koji ima id="myID" :
//dobijamo element koji ima id="myID" var myID = document.getElementById("myID"); //dobijemo zadnji podređeni čvor elementa myID var lastNode = myID.lastChild; //zato što ne znamo da li je posljednji podređeni čvor elementa element, //onda ćemo koristiti while petlja da biste pronašli zadnji podređeni element elementa myID //dok element ima čvor i njegov tip nije 1 (tj. nije element) uradite while(lastNode && lastNode.nodeType!=1) ( //idite na prethodni čvor lastNode = lastNode.previousSibling ) //ako smo pronašli element na myID čvoru if (lastNode) ( //onda se mora ukloniti lastNode.parentNode.removeChild(lastNode); )
Na primjer, uklonite sve podređene čvorove elementa koji ima id="myQuestion" :
//dobijamo element iz kojeg želimo ukloniti sve njegove podređene čvorove var elementQuestion = document.getElementById("myQuestion"); //dok postoji prvi element while (elementQuestion.firstElement) ( //uklonimo elementQuestion.removeChild(element.firstChild); )
Ako trebate da kreirate HTML element, a ne znate kako da ga implementirate, onda ste došli na pravo mjesto. Ovaj članak neće samo pogledati primjer stvaranja elementa, već će i napisati univerzalnu funkciju s kojom možete kreirati novi element, dodajte mu razne atribute, ispunite ga tekstom.
Ali prvo, počnimo s nečim jednostavnim. Prilikom kreiranja novog elementa koristićemo metode DOM objekta, i to:
* document.createElement(param) - ova metoda se koristi direktno za kreiranje elementa. Kao parametar uzima ime elementa koji se kreira. Vraća vezu do kreiranog elementa.
document.createElement('div'); // će kreirati div element.
* document.appendChild(param) – ovaj metod se koristi za dodavanje elementa u HTML kod. Uzima vezu do kreiranog elementa kao parametar;
var parent = document.getElementsByTagName("BODY"); //dobijemo vezu do elementa tijela
var elem = document.createElement(‘div’);// će kreirati div element
parent.appendChild(elem // dodaje element, pri čemu je parent veza na koju će biti dodan naš element, u ovom slučaju to je tijelo tijela);
* document.createTextNode() - metoda se koristi za postavljanje teksta unutar elementa.
Primjer kreiranja elementa.
funkcija createElem() (
Var newP = document.createElement("p");
NewP.className = "elemClass";
NewP.id = "myPId";
NewP.style.width = "100px";
NewP.style.height = "300px";
NewP.style.background = "#c5c5c5";
NewP.style.color = "#000";
Var text = "tekst za umetanje";
Var textNode = document.createTextNode(text);
NewP.appendChild(textNode);
Parent.appendChild(newP);
U funkciji createElem, roditeljska varijabla je referenca na element (tijelo) u koji će se novi element postaviti. Zatim se kreira novi element P, dodaju mu se atributi id, klasa, stil i postavljaju vrijednosti ovih atributa. Zatim se kreira tekstualni čvor i dodaje našem novom elementu. Nakon svega ovoga, sam element se dodaje tijelu tijela. Da biste napravili veliki broj novih elemenata moraćete da se potrudite, jer... možda ćete morati da ih postavite na različita mjesta na web stranici, npr. pričvrstiti na različite elemente.
Primjer kreiranja elementa pomoću univerzalne funkcije.
Ova funkcija će vam pomoći da kreirate novi element, dodate mu različite atribute, priložite mu tekstualni čvor, postavite ga ispred ili iza navedenog elementa ili zamijenite element novokreiranim elementom. Potreban je samo argument name.
funkcija createElement(ime, atributi, stil, tekst, prošli_id, pozicija, promijenjeno) (
Var parent = document.getElementsByTagName("BODY");
Var e = document.createElement(name);
Ako (attrs) (
Za (ključ u attre) (
Ako (ključ == "klasa") (
E.className = attrs;
) else if (ključ == "id") (
E.id = attrs;
) drugo (
E.setAttribute(ključ, attrs);
Ako (stil) (
Za (ključ u stilu) (
E.style = stil;
Ako (tekst) (
E.appendChild(document.createTextNode(text));
Parent.appendChild(e);
If(prošlog_id)(
Var old_elem = document.getElementById(past_id);
If(pozicija=="prije")(
Parent.insertBefore(e,old_elem)
)else if(position=="nakon")(
InsertAfter(parent,e,old_elem);
If(promijenjeno!="" && promijenjeno==tačno)(
Parent.removeChild(old_elem);
Parametri:
Ime – naziv elementa;
Attrs – atributi kreiranog elementa;
Stil – stilovi kreiranog elementa;
Tekst – umetnuti tekst;
Past_id – id elementa pored kojeg će se naš element nalaziti;
Pozicija - može uzeti dvije vrijednosti prije, poslije;
Promijenjeno – oznaka koja ima dvije vrijednosti: true ili false Ako je ovaj parametar postavljen na true, stari element će biti zamijenjen novim;
Kao primjer, napravimo DIV element sa atributima i zamijenimo stari element novim.
createElement("div",
("class": "myDivCSSClass", "id": "myDivId","align":"center"),
("width": "200px", "height": "250px", "background": "#3B9D00", "color": "#fff"),
"evo mog teksta",
"test",
"prije"