Zawsze mylono mnie między HTMLCollections, obiektami i tablicami, jeśli chodzi o DOM. Na przykład...
- Jaka jest różnica między
document.getElementsByTagName("td")
i$("td")
? $("#myTable")
i$("td")
są obiektami (obiektami jQuery). Dlaczego console.log pokazuje również tablicę elementów DOM obok nich i czy nie są to obiekty ani tablica?- O co chodzi w nieuchwytnych „NodeLists” i jak je wybrać?
Prosimy o podanie dowolnej interpretacji poniższego skryptu.
Dziękuję Ci
[123,"abc",321,"cba"]=[123,"abc",321,"cba"]
{123:123,abc:"abc",321:321,cba:"cba"}=Object { 123=123, abc="abc", 321=321, more...}
Node= Node { ELEMENT_NODE=1, ATTRIBUTE_NODE=2, TEXT_NODE=3, more...}
document.links= HTMLCollection[a #, a #]
document.getElementById("myTable")= <table id="myTable">
document.getElementsByClassName("myRow")= HTMLCollection[tr.myRow, tr.myRow]
document.getElementsByTagName("td")= HTMLCollection[td, td, td, td]
$("#myTable")= Object[table#myTable]
$("td")= Object[td, td, td, td]
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1" />
<title>Collections?</title>
<script src="http://code.jquery.com/jquery-latest.js" type="text/javascript"></script>
<script type="text/javascript">
$(function(){
console.log('[123,"abc",321,"cba"]=',[123,"abc",321,"cba"]);
console.log('{123:123,abc:"abc",321:321,cba:"cba"}=',{123:123,abc:"abc",321:321,cba:"cba"});
console.log('Node=',Node);
console.log('document.links=',document.links);
console.log('document.getElementById("myTable")=',document.getElementById("myTable"));
console.log('document.getElementsByClassName("myRow")=',document.getElementsByClassName("myRow"))
console.log('document.getElementsByTagName("td")=',document.getElementsByTagName("td"));
console.log('$("#myTable")=',$("#myTable"));
console.log('$("td")=',$("td"));
});
</script>
</head>
<body>
<a href="#">Link1</a>
<a href="#">Link2</a>
<table id="myTable">
<tr class="myRow"><td>td11</td><td>td12</td></tr>
<tr class="myRow"><td>td21</td><td>td22</td></tr>
</table>
</body>
</html>
javascript
jquery
dom
user1032531
źródło
źródło
document.querySelectorAll('td')
i$('td')
. (b) Podstawowa różnica polega na tym, że jQuery działa z własnym typem obiektu, który zawiera między innymi ponumerowaną kolekcję elementów HTML; ta kolekcja nie jest żadną z powyższych, a obiekt jQuery jest zasadniczo opakowaniem otaczającym prawdziwe elementy DOM.Odpowiedzi:
Najpierw wyjaśnię różnicę między
NodeList
iHTMLCollection
.Oba interfejsy są kolekcjami węzłów DOM. Różnią się metodami, które zapewniają i typem węzłów, które mogą zawierać. Podczas gdy
NodeList
może zawierać dowolny typ węzła,HTMLCollection
powinien zawierać tylko węzły elementów.An
HTMLCollection
udostępnia te same metody co aNodeList
i dodatkowo metodę o nazwienamedItem
.Kolekcje są zawsze używane, gdy trzeba zapewnić dostęp do wielu węzłów, np. Większość metod selektora (takich jak
getElementsByTagName
) zwraca wiele węzłów lub uzyskuje odwołanie do wszystkich elementów podrzędnych (element.childNodes
).Aby uzyskać więcej informacji, zajrzyj do specyfikacji DOM4 - Kolekcje .
getElementsByTagName
to metoda interfejsu DOM. Akceptuje nazwę znacznika jako dane wejściowe i zwracaHTMLCollection
(patrz specyfikacja DOM4 ).$("td")
to prawdopodobnie jQuery. Akceptuje dowolny prawidłowy selektor CSS / jQuery i zwraca obiekt jQuery.Największą różnicą między standardowymi kolekcjami DOM a selekcjami jQuery jest to, że kolekcje DOM są zwykle aktywne (chociaż nie wszystkie metody zwracają kolekcję na żywo), tj. Wszelkie zmiany w DOM są odzwierciedlane w kolekcjach, jeśli mają na nie wpływ. Są jak widok drzewa DOM, podczas gdy wybory z jQuery są migawkami drzewa DOM w momencie wywołania funkcji.
Obiekty jQuery są obiektami podobnymi do tablic , tj. mają właściwości numeryczne i
length
właściwość (pamiętaj, że tablice są same w sobie obiektami). Przeglądarki mają tendencję do wyświetlania tablic i obiektów podobnych do tablic w specjalny sposób, na przykład[ ... , ... , ... ]
.Zobacz pierwszą część mojej odpowiedzi. Nie możesz wybrać
NodeList
s, są one wynikiem selekcji.O ile wiem, nie ma nawet sposobu na
NodeList
programowe tworzenie s (tj. Tworzenie pustego i dodawanie węzłów później), są one zwracane tylko przez niektóre metody / właściwości DOM.źródło
td
elementy, dodanie nowegotd
elementu później nie zaktualizuje automatycznie wyboru, aby zawierał nowy element.NodeList
s są pod napięciem..forEach()
a drugi nie?0. Jaka jest różnica między
HTMLCollection
a aNodeList
?Oto kilka definicji dla Ciebie.
Specyfikacja DOM Level 1 - różne definicje obiektów :
Specyfikacja DOM Level 3 - NodeList
Więc oba mogą zawierać aktualne dane, co oznacza, że DOM zaktualizuje się, gdy zrobią to ich wartości. Zawierają również inny zestaw funkcji.
Jeśli sprawdzisz konsolę, jeśli uruchomisz skrypty, zauważysz, że
table
element DOM zawiera zarówno a, jakchildNodes
NodeList[2]
i achildren
HTMLCollection[1]
. Dlaczego się różnią? PonieważHTMLCollection
może zawierać tylko węzły elementów, NodeList zawiera również węzeł tekstowy.1. Jaka jest różnica między
document.getElementsByTagName("td")
i$("td")
?document.getElementsByTagName("td")
Zwraca tablicę elementów DOM (aNodeList
),$("td")
nazywa się obiekt jQuery, który posiada elementy zdocument.getElementsByTagName("td")
jego właściwości0
,1
,2
, itd. Główną różnicą jest to, że obiekt jQuery jest trochę wolniej odzyskać, ale daje dostęp do wszystkich poręczny Funkcje jQuery.2.
$("#myTable")
i$("td")
są obiektami (jQuery
obiektami). Dlaczegoconsole.log
obok nich jest wyświetlana tablica elementów DOM i czy nie są to obiekty ani tablica?Są to obiekty z ich właściwości
0
,1
,2
itd zestaw do elementów DOM. Oto prosty przykład: jak to działa:jsFiddle
var a = { 1: "first", 2: "second" } alert(a[1]);
3. O co chodzi w nieuchwytnych „NodeLists” i jak je wybrać?
Pobierasz je w swoim kodzie
getElementsByClassName
igetElementsByTagName
oba zwracająNodeList
sźródło
length
właściwości, a nie numerycznych nazw właściwości. A co ma wspólnego twój przykład z ostrzeżeniem łańcuchaconsole.log
?Dodatkowa uwaga
Jaka jest różnica między HTMLCollection a NodeList?
HTMLCollection zawiera tylko węzły element ( znaczniki ) i NodeList zawiera wszystkie węzły .
Istnieją cztery typy węzłów:
nodeTypes
Spacje wewnątrz elementów są traktowane jako tekst, a tekst jako węzły.
Rozważ następujące:
<ul id="myList"> <!-- List items --> <li>List item 1</li> <li>List item 2</li> <li>List item 3</li> <li>List item 4</li> <li>List item 5</li> </ul>
Biała przestrzeń:
<ul id="myList"> <li>List item</li></ul>
Bez spacji:
<ul id="myList"><li>List item</li></ul>
źródło
$("td")
jest rozszerzonym obiektem jQuery i posiada metody jQuery, zwraca obiekt jquery zawierający tablicę obiektów html.document.getElementsByTagName("td")
jest surową metodą js i zwraca NodeList. Zobacz ten artykułźródło
Obiekty NodeList to kolekcje węzłów zwracane na przykład przez x. childNodes lub metoda document.querySelectorAll () . W niektórych przypadkach, NodeList jest na żywo , co oznacza, że zmiany w DOM automatycznie aktualizować kolekcję! Na przykład Node.childNodes jest aktywny:
var c = parent.childNodes; //assume c.length is 2 parent.appendChild(document.createElement('div')); //now c.length is 3, despite the `c` variable is assigned before appendChild()!! //so, do not cache the list's length in a loop.
Ale w niektórych innych przypadkach NodeList jest statyczna , gdzie wszelkie zmiany w DOM nie wpływają na zawartość kolekcji. querySelectorAll () zwraca statyczną listę NodeList.
HTMLCollection jest na żywo i nakazał zbiór elementów (to jest automatycznie aktualizowany, gdy dokument będący podstawą ulega zmianie). Może to wynikać z właściwości, takich jak dzieci lub metody, takie jak document.getElementsByTagName () i może mieć tylko elementy HTMLElement jako ich elementy.
HTMLCollection ujawnia również swoich członków bezpośrednio jako właściwości według nazwy i indeksu:
var f = document.forms; // this is an HTMLCollection f[0] === f.item(0) === f.myForm //assume first form id is 'myForm'
HTMLElement to tylko jeden typ węzłów:
Węzeł może mieć kilka typów . Najważniejsze z nich to:
<p>
lub<div>
.Tak więc dużą różnicą jest to, że HTMLCollection zawiera tylko elementy HTMLElements, ale NodeList zawiera również komentarze, tekst z odstępami (znaki powrotu karetki, spacje ...), itd. Sprawdź to jak w następującym fragmencie:
function printList(x, title) { console.log("\r\nprinting "+title+" (length="+x.length+"):"); for(var i=0; i<x.length; i++) { console.log(" "+i+":"+x[i]); } } var elems = document.body.children; //HTMLCollection var nodes = document.body.childNodes; //NodeList printList(elems, "children [HTMLCollection]"); printList(nodes, "childNodes [NodeList]");
<div>para 1</div><!-- MyComment --> <div>para 2</div>
Zarówno HTMLCollection, jak i NodeList zawierają właściwość length, której można użyć do zapętlenia ich elementów. Nie używaj for ... in lub for each ... in do wyliczania elementów w NodeLists, ponieważ będą one również wyliczać długość i właściwości elementu oraz powodować błędy, jeśli twój skrypt zakłada, że ma do czynienia tylko z obiektami elementów. Ponadto firma for..in nie gwarantuje odwiedzenia nieruchomości w określonej kolejności.
for (var i = 0; i < myNodeList.length; i++) { var item = myNodeList[i]; }
źródło
Tyle już powiedziano, ale pomogłaby bardziej podsumowana wersja odpowiedzi z przykładem wyjaśniającym różnice między
HTMLCollection
iNodeList
.Rodzaje węzłów w DOM
Możemy użyć następujących trzech właściwości, aby sprawdzić i zapytać o węzły w DOM:
nodeType
własnośćnodeName
własnośćnodeValue
własnośćnodeType
Właściwość zwraca typ węzła, jak numer, z określonego węzła.nodeType
właściwość zwróci wartość 1 .nodeType
właściwość zwróci wartość 2 .nodeType
właściwość zwróci wartość 3 .nodeType
właściwość zwróci wartość 8 .HTMLCollection a NodeList
Możemy lepiej zrozumieć różnice między
HTMLCollection
iNodeList
na poniższym przykładzie. Spróbuj sprawdzić wyniki we własnej konsoli przeglądarki, aby lepiej je zrozumieć.<ul> <li>foo</li> <li>bar</li> <li>bar</li> </ul>
// retrieve element using querySelectorAll const listItems_querySelector = document.querySelectorAll('li'); console.log('querySelector', listItems_querySelector); // retrieve element using childNodes const list = document.querySelector('ul') const listItems_childNodes = list.childNodes; console.log('childNodes', listItems_childNodes); const listItems_children = list.children; console.log('children', listItems_children); const listItems_getElementsByTagName = document.getElementsByTagName('li'); console.log('getElementsByTagName', listItems_getElementsByTagName); console.log('*************************'); console.log('add one list item'); console.log('*************************'); list.appendChild(document.createElement('li')); console.log('querySelector', listItems_querySelector); console.log('childNodes', listItems_childNodes); console.log('children', listItems_children); console.log('getElementsByTagName', listItems_getElementsByTagName); console.log('*************************'); console.log('add one more list item'); console.log('*************************'); listItems_getElementsByTagName[0].parentNode.appendChild(document.createElement('li')); console.log('querySelector', listItems_querySelector); console.log('childNodes', listItems_childNodes); console.log('children', listItems_children); console.log('getElementsByTagName', listItems_getElementsByTagName);
źródło