Разница между HTMLCollection, NodeLists и массивами объектов
Я всегда путался между HTMLCollections, объектами и массивами, когда дело доходит до DOM. Например...
- в чем разница между
document.getElementsByTagName("td")
и$("td")
? -
$("#myTable")
и$("td")
являются объектами (объекты jQuery). Почему именно консоль.журнал также показывает массив элементов DOM рядом с ними, и они не являются объектами и не массивом? - Что такое неуловимые "NodeLists" все о том, и как я могу выбрать один?
Пожалуйста, также предоставьте любую интерпретацию приведенного ниже сценария.
спасибо
[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>
5 ответов:
сначала я объясню разницу между
NodeList
иHTMLCollection
.оба интерфейса коллекции узлов DOM. Они отличаются по методам, которые они предоставляют, и по типу узлов, которые они могут содержать. В то время как
NodeList
может содержать любой тип узлеHTMLCollection
должен содержать только узлы-элементы.
АнHTMLCollection
предоставляет те же методы, что иNodeList
и дополнительно метод, называемыйnamedItem
.коллекции всегда используются, когда доступ должен быть предоставлен к нескольким узлам, например, большинство методов селектора (например,
getElementsByTagName
) возврат нескольких узлов или получение ссылки на все дочерние элементы (element.childNodes
).для получения дополнительной информации, посмотрите на спецификация DOM4 - коллекции.
в чем разница между
document.getElementsByTagName("td")
и$("td")
?
getElementsByTagName
- это метод интерфейса DOM. Он принимает имя тега в качестве входных данных и возвращаетHTMLCollection
(см. спецификация DOM4).
$("td")
предположительно jQuery. Он принимает любой допустимый селектор CSS/jQuery и возвращает объект jQuery.самые большие различия между стандартными коллекциями DOM и выборками jQuery заключаются в том, что коллекции DOM являются обычно live (хотя не все методы возвращают живую коллекцию), т. е. любые изменения в DOM отражаются в коллекциях, если они затронуты. Они похожи на view на Дерево DOM, в то время как выбор jQuery-это снимки дерева DOM в момент вызова функции.
почему консоли.журнал также показывает массив элементов DOM рядом с ними, и они не являются объектами и не массивом?
jQuery объекты массив-как объекты, т. е. они имеют числовые свойства и
length
свойство (имейте в виду, что массивы являются только сами объекты). Браузеры, как правило, для отображения массивов и массивов объекты особым образом, как[ ... , ... , ... ]
.что такое неуловимые "NodeLists" все о, и как я могу выбрать один?
Смотрите первую часть моего ответа. Вы не можете выберите
NodeList
s, они результат выбор.насколько я знаю, нет даже способа создать
NodeList
s программно (т. е. создание пустого и добавление узлов позже), они возвращаются только некоторыми DOM методы/свойства.
0. в чем разница между
HTMLCollection
иNodeList
?вот некоторые определения для вас.
DOM Level 1 Spec-разные определения объектов:
Интерфейс HTMLCollection
HTMLCollection-это список узлов. К отдельному узлу можно получить доступ либо по порядковому индексу, либо по имени узла или атрибутам id. Примечание: предполагается, что коллекции в HTML DOM быть живым означает, что они автоматически обновляются при изменении базового документа.
Интерфейс NodeList
интерфейс NodeList обеспечивает абстракцию упорядоченной коллекции узлов, не определяя и не ограничивая способ реализации этой коллекции. Объекты прописаны в доме живут.
элементы в списке узлов доступны через интегральный показатель, начиная с 0.
таким образом, они оба могут содержать живые данные, что означает, что DOM будет обновляться, когда их значения делают. Они также содержат другой набор функций.
вы заметите, если вы проверите консоль, если вы запустите свои скрипты, что
table
DOM-элемент, который содержит какchildNodes
NodeList[2]
иchildren
HTMLCollection[1]
. Почему они разные? Потому чтоHTMLCollection
может содержать только узлы элементов, NodeList также содержит текст узел.1. В чем разница между
document.getElementsByTagName("td")
и$("td")
?
document.getElementsByTagName("td")
возвращает массив элементов DOM (aNodeList
),$("td")
называется объектом jQuery, который имеет элементы изdocument.getElementsByTagName("td")
по своим свойствам0
,1
,2
и т. д. Основное отличие заключается в том, что объект jQuery немного медленнее извлекается, но дает доступ ко всем удобным функциям jQuery.2.
$("#myTable")
и$("td")
есть объекты (jQuery
объекты). Почему этоconsole.log
также показывает массив элементов DOM рядом с ними, и они не являются объектами и не массив?это объекты со своими свойствами
0
,1
,2
и т. д. набор элементов DOM. Вот простой пример: как это работает:var a = { 1: "first", 2: "second" } alert(a[1]);
3. Что такое неуловимые "NodeLists" все о, и как я могу выбрать один?
вы извлекали их в коде
getElementsByClassName
иgetElementsByTagName
как вернутьNodeList
s
$("td")
является расширенным объектом jQuery и имеет методы jQuery, он возвращает объект jquery, содержащий массив объектов html.document.getElementsByTagName("td")
является необработанным методом js и возвращает NodeList. эту статью
дополнительная информация
в чем разница между HTMLCollection и NodeList?
A HTMLCollection содержит только узлы-элементы (теги) и NodeList содержит все узлы.
существует четыре типа узлов:
- элемента
- узел атрибута
- текстовый узел
- комментарий узел
пробелы внутри элементов рассматриваются как текст, а текст-как узлы.
рассмотрим следующее:
<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>
пробел:
<ul id="myList"> <li>List item</li></ul>
нет пробелов:
<ul id="myList"><li>List item</li></ul>
The NodeList объекты-это коллекции узлов, возвращаемые, например, x.childNodes собственность или документ.querySelectorAll() метод. В некоторых случаях NodeList-это live, что означает, что изменения в DOM автоматически обновляют коллекцию! Например, узел.childNodes-это видео:
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.
но в некоторых других случаях, NodeList-это статический, где любые изменения в DOM не влияет на содержимое коллекции. querySelectorAll() возвращает статический NodeList.
The HTMLCollection это видео и заказал коллекция элементов (она автоматически обновляется при изменении базового документа). Это может быть результатом свойств как дети или методы, такие какдокумент.getElementsByTagName () и могло быть только объект HTMLElement это как их элементы.
HTMLCollection также предоставляет свои члены непосредственно как свойства по имени и индексу:
var f = document.forms; // this is an HTMLCollection f[0] === f.item(0) === f.myForm //assume first form id is 'myForm'
HTMLElement - это только один тип узлов:
узел может быть несколько видов. Наиболее важными из них являются следующие:
- элемент (1): узел элемента, например
(2): атрибут элемента. Атрибуты элемента больше не реализуют интерфейс узла в спецификации DOM4!<p>
или<div>
.- текст (3): фактический текст элемента или атрибута.
- комментарий (8): узел комментариев.
- документ (9): узел документа.
итак, большая разница заключается в том, что HTMLCollection содержит только HTMLElements, но NodeList также содержит комментарии, пробелы (каретка возврат символов, пробелов..), прием. Проверьте это, как в следующем фрагменте:
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>
и HTMLCollection и NodeList содержат длина свойство, которое вы можете использовать для цикл над их элементов. Не использовать for...in или для each...in чтобы перечислить элементы в NodeLists, поскольку они также будут перечислять его длину и свойства элемента и вызывать ошибки, если ваш скрипт предполагает, что он имеет дело только с объектами элементов. Кроме того, for..in есть не гарантируется посещение объектов недвижимости в каком-либо определенном порядке.
for (var i = 0; i < myNodeList.length; i++) { var item = myNodeList[i]; }