To czwarta część postów poświęcona natywnym odpowiednikom metod jQuery. Możesz przeczytać i zanim będziesz kontynuować.
W tym artykule przyjrzymy się sposobom tworzenia, wstawiania, przenoszenia i usuwania elementów. Chociaż jQuery zawiera już wiele przydatnych metod, zdziwisz się, gdy dowiesz się, że wszystko to można łatwo zrobić przy użyciu metod natywnych.
Manipulowanie kodem HTML elementów jQuery // get var html = $(elem).html(); // set $(elem).html("Nowy HTML"); Natywny JS // get var html = elem.innerHTML; // set elem.innerHTML = "Nowy HTML"; Manipulacja tekstem elementu jQuery // pobierz var tekst = $(elem).text(); // set $(elem).text("Nowy tekst"); Natywny JS // pobierz var tekst = elem.textContent; // set elem.textContent = "Nowy tekst"; Tworzenie elementu jQuery $(""); Natywny dokument JS.createElement("div"); Dołącza treść na końcu elementów jQuery $(parentNode).append(newNode); Natywny JS parentNode.appendChild(newNode); Dodaje treść na początek elementów jQuery $(referenceNode).prepend(newNode); Natywny Node JS referenceNode.insertBefore(newNode, referenceNode.firstElementChild); // lub referenceNode.insertAdjacentElement("afterbegin", newNode); // FF 48.0+, IE8+ Wstaw bezpośrednio przed elementem jQuery $(referenceNode).before(newNode); Natywny Node JS referenceNode.parentNode.insertBefore(newNode, referenceNode); // lub referenceNode.insertAdjacentElement("beforebegin", newNode); // FF 48.0+, IE8+ Wstaw bezpośrednio po elemencie jQuery $(referenceNode).after(newNode); Natywny Node JS referenceNode.parentNode.insertBefore(newNode, referenceNode.nextElementChild); // lub referenceNode.insertAdjacentElement("afterend", newNode); // FF 48.0+, IE8+Uwaga: „beforebegin” i „afterend” będą działać tylko wtedy, gdy węzeł referencyjny znajduje się w drzewie DOM i ma element nadrzędny.
Spójrz na poniższe:
ReferenceNode.insertAdjacentElement(pozycja, węzeł);
Metoda wstawAdjacentElement przyjmuje dwa parametry:
Jakiś tekst Jakiś tekst var elem1 = document.getElementById("elem1"); var elem2 = document.getElementById("elem2"); elem1.insertAdjacentElement("przed końcem", elem2); // wynik Jakiś tekstJakiś tekst
Metoda wstawAdjacentElement jest czystsza i bardziej intuicyjna niż metoda wstawBefore, ale ta druga jest lepiej obsługiwana w starszych przeglądarkach.
Dodawanie elementów wiele razyWarto również zauważyć, że dodanie elementu do węzła znajdującego się w drzewie DOM spowoduje przerysowanie. Nie jest to zbyt dobre, ponieważ przeglądarka musi ponownie obliczyć rozmiar i położenie nowego elementu, co spowoduje również zmianę jego dzieci, przodków i elementów pojawiających się po nim w DOM. Jeśli dodajesz wiele elementów do DOM, może to chwilę potrwać.
Aby tego uniknąć, możesz dodać za pomocą DocumentFragment. Fragment dokumentu to obiekt dokumentu, który istnieje tylko w pamięci, więc dołączenie do niego nie spowoduje żadnych przepływów.
Powiedzmy, że musimy dodać 100 elementów li do elementu ul obecnego w drzewie DOM:
// Pobierz element, który będzie zawierał nasze elementy var ul = document.querySelector("ul"); // utwórz 100 elementów listy dla (var i = 1; i< 100; i++) { var li = document.createElement("li"); // append the new list element to the ul element ul.appendChild(li); }
W powyższym przykładzie elementy li są dodawane bezpośrednio do elementu ul, który znajduje się w drzewie DOM, co powoduje przerysowanie przy każdej iteracji - to 100 zmian!
Znajdźmy najlepszy sposób.
// Pobierz element, który będzie zawierał nasze elementy var ul = document.querySelector("ul"); // utwórz fragment dokumentu, aby dołączyć elementy listy do var docFrag = document.createDocumentFragment(); // utwórz 100 elementów listy dla (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);
W tym samym przykładzie elementy li są dodawane do fragmentu dokumentu znajdującego się w pamięci, tak że ponowne przepływ zostanie wywołane, gdy fragment zostanie dodany do elementu ul. Ta metoda zmniejszy liczbę przerysowań ze 100 do 1.
Usuwanie elementu jQuery $(referenceNode).remove(); Natywny referencja JS.parentNode.removeChild(referenceNode); // lub referenceNode.remove(); // FF 23.0+, 23.0+, Edge (bez obsługi IE)W tym poście chcę Ci powiedzieć jak dodać lub usunąć element z obiektu w JavaScript. To bardzo proste, ale wielu początkujących, jak ja wcześniej, często jest przez to zdezorientowanych.
Utwórz przykładowy obiekt var obj = ( nazwa: „alex”, nazwisko: „petrov”, strona internetowa: „site”, );Mamy prosty obiekt, wewnątrz którego znajdują się dane takie jak imię (imię), nazwisko (nazwisko) oraz strona internetowa (strona internetowa). Dane mogą dotyczyć absolutnie wszystkiego, ale na potrzeby tego rekordu będą to tylko te dane.
Dodanie nowego elementu obj.country = "ru"; // dodaje do obiektu nowy klucz "kraj" o wartości "ru" obj["miasto"] = "Moskwa"; // doda także nowy klucz, tylko „miasto” o wartości „Moskwa”Powyższy kod jest przejrzysty, jednak dla jasności można dodać nowe wartości do obiektu w składni obiektu za pomocą „.” i klucz lub zwykły format tablicy. Jeśli zadeklarujesz to jako tablicę, obj nadal będzie obiektem, ponieważ wcześniej go tak oznaczyłeś dzięki () .
Utwórz obiekt wewnątrz obiektu obj.other_obj = (); // utwórz nową wartość other_obj w obj i uczyń ją obiektemTeraz dodajmy tam trochę danych:
Obj.other_obj.first = "pierwszy klucz nowego obiektu"; obj.other_obj.sekunda = "drugi";
Stworzyliśmy dwie nowe wartości pierwszą i drugą wewnątrz other_obj .
Usuwanie elementu usuń obj.name; // zwraca wartość trueMożesz użyć usuwania , które może usuwać elementy z obiektów. Nie możesz w ten sposób usunąć całego obiektu, ale jeśli tego potrzebujesz, możesz to zrobić w ten sposób:
obiekt = (); // Spraw, aby obiekt znów był pusty
To wszystko, jeśli nadal masz pytania dotyczące obiektów w JavaScript, napisz komentarz poniżej, postaram się Ci pomóc.
Ostatnia aktualizacja: 1.11.2015
Obiekt dokumentu posiada następujące metody tworzenia elementów:
createElement(elementName): Tworzy element HTML, którego znacznik jest przekazywany jako parametr. Zwraca utworzony element
createTextNode(text) : Tworzy i zwraca węzeł tekstowy. Tekst węzła jest przekazywany jako parametr.
Zatem zmienna elem będzie przechowywać odniesienie do elementu div. Jednak samo utworzenie elementów nie wystarczy, należy je jeszcze dodać do strony internetowej.
Aby dodać elementy możemy skorzystać z jednej z metod obiektu Node:
appendChild(newNode): dodaje nowy węzeł newNode na końcu kolekcji węzłów podrzędnych
wstawBefore(newNode, referenceNode): wstawia nowy węzeł newNode przed węzłem referencyjnym
Używamy metody appendChild:
Tytuł artykułu
Pierwszy paragraf
Akapit drugi
var artykułDiv = document.querySelector("div.article"); // utwórz element var elem = document.createElement("h2"); // utwórz dla niego tekst var elemText = document.createTextNode("Hello world"); // dodaj tekst do elementu jako element podrzędny elem.appendChild(elemText); // dodaj element do div artykułDiv.appendChild(elem);Najpierw tworzymy zwykły element nagłówka h2 i węzeł tekstowy. Następnie do elementu nagłówka dodawany jest węzeł tekstowy. Następnie dodajemy tytuł do jednego z elementów strony internetowej:
Nie musimy jednak tworzyć dodatkowego węzła tekstowego, aby zdefiniować tekst wewnątrz elementu, ponieważ możemy skorzystać z właściwości textContent i bezpośrednio przypisać do niego tekst:
Varelem = document.createElement("h2"); elem.textContent = "Witaj, świecie";
W takim przypadku węzeł tekstowy zostanie utworzony domyślnie podczas ustawiania tekstu.
Zastanów się teraz, jak dodać podobny element na początek kolekcji węzłów potomnych bloku div:
Var artykułDiv = document.querySelector("div.article"); // utwórz element var elem = document.createElement("h2"); // utwórz dla niego tekst var elemText = document.createTextNode("Hello world"); // dodaj tekst do elementu jako element podrzędny elem.appendChild(elemText); // pobierz pierwszy element, który ma zostać dodany przed var FirstElem = artykułDiv.firstChild.nextSibling; // dodaj element do elementu div przed pierwszym węzłem artykułDiv.insertBefore(elem, pierwszyElem);
Jeśli chcemy wstawić nowy węzeł w drugim, trzecim lub innym miejscu, to musimy znaleźć węzeł, przed którym chcemy wstawić, korzystając z kombinacji właściwości FirstChild/lastChild i nextSibling/previousSibling.
Kopiowanie elementuCzasami elementy mają dość złożoną kompozycję i znacznie łatwiej jest je skopiować, niż tworzyć treść z oddzielnych wywołań. Aby skopiować istniejące węzły z obiektu Node, możesz użyć metody cloneNode():
Var artykułDiv = document.querySelector("div.article"); // sklonuj element artykułuDiv var newArticleDiv = artykułDiv.cloneNode(true); // dołącz na końcu elementu treści document.body.appendChild(newArticleDiv);
Do metody cloneNode() przekazywana jest wartość logiczna jako parametr: jeśli zostanie przekazana wartość true, element zostanie skopiowany ze wszystkimi węzłami potomnymi; jeśli zostanie przekazana wartość false, zostanie ona skopiowana bez węzłów podrzędnych. Oznacza to, że w tym przypadku kopiujemy węzeł z całą jego zawartością i następnie dodajemy go na końcu elementu body.
Usuwanie elementuAby usunąć element, wywoływana jest metoda usuwaniaChild() obiektu Node. Ta metoda usuwa jeden z węzłów podrzędnych:
Var artykułDiv = document.querySelector("div.article"); // znajdź węzeł do usunięcia - pierwszy akapit var usuwalnyNode = document.querySelectorAll("div.article p"); // usuń węzeł artykułDiv.removeChild(removableNode);
W takim przypadku pierwszy akapit zostanie usunięty z bloku div.
Wymiana elementuAby zastąpić element, należy użyć metody zamianyChild(newNode, oldNode) obiektu Node. Metoda ta przyjmuje nowy element jako pierwszy parametr, który zastępuje stary element oldNode przekazany jako drugi parametr.
Var artykułDiv = document.querySelector("div.article"); // znajdź węzeł do zastąpienia - pierwszy akapit var oldNode = document.querySelectorAll("div.article p"); // utwórz element var newNode = document.createElement("h2"); // utwórz dla niego tekst var elemText = document.createTextNode("Hello world"); // dodaj tekst do elementu jako dziecko newNode.appendChild(elemText); // zastąp stary węzeł nowym artykułDiv.replaceChild(newNode, oldNode);
W takim przypadku zastąp pierwszy akapit nagłówkiem h2.
Na tej lekcji nauczymy się tworzyć węzły elementów (createElement) i węzły tekstowe (createTextNode). Rozważ także metody dodawania węzłów do drzewa (appendChild, wstawBefore) i usuwania węzłów z drzewa (removeChild).
Dodawanie węzłów do drzewaDodanie nowego węzła do drzewa zwykle odbywa się w 2 krokach:
Na przykład:
Spójrzmy na bardziej złożony przykład, w którym dodajemy węzeł LI do drzewa zawierającego węzeł tekstowy z tekstem „Smartfon” na końcu listy ul.
Aby to zrobić, wykonaj następujące czynności:
Praca z istniejącymi węzłami przy użyciu metod appendChild() i wstawBefore() również odbywa się dwuetapowo:
Na przykład dodaj istniejący element li zawierający tekst „Tablet” na górę listy (spowoduje to usunięcie go z poprzedniej pozycji):
//pobierz element UL zawierający listę według jego identyfikatora var elementUL = document.getElementById("list"); //pobierz element li zawierający węzeł tekstowy „Tablet” var elementLI = elementUL.childNodes; //dodaj element na początek listy //spowoduje to usunięcie go z pierwotnej lokalizacji elementUL.insertBefore(elementLI,elementUL.firstChild);
Usunięcie węzła z drzewa odbywa się w 2 etapach:
//znajdź węzeł, który chcemy usunąć var findElement = document.getElementById("notebook"); //wywołaj metodę usuwaniaChild w węźle nadrzędnym //i przekaż jej znaleziony węzeł jako parametr findElement.parentNode.removeChild(findElement);
Na przykład usuń ostatnie dziecko elementu za pomocą id="myID" :
//pobierz element z id="myID" var myID = document.getElementById("myID"); //pobierz ostatni węzeł potomny elementu myID var lastNode = myID.lastChild; //ponieważ nie wiemy, czy ostatni węzeł potomny elementu jest elementem, //użyj pętli while, aby znaleźć ostatnie dziecko elementu myID //o ile element ma węzeł i jego typ nie jest równy 1 (tzn. to nie jest element) wykonaj while (lastNode && lastNode.nodeType!=1) ( //przejdź do poprzedniego węzła lastNode = lastNode.previousSibling; ) //jeśli znaleźliśmy element w węźle myID if (lastNode) ( // następnie należy go usunąć lastNode.parentNode.removeChild( lastNode); )
Na przykład usuń wszystkie węzły podrzędne z elementu za pomocą id="myQuestion" :
//pobierz element, z którego chcemy usunąć wszystkie jego węzły podrzędne var elementQuestion = document.getElementById("myQuestion"); //podczas gdy istnieje pierwszy element while (elementQuestion.firstElement) ( //usuń go elementQuestion.removeChild(element.firstChild); )
Ćwiczenia