Разница между HTMLCollection, NodeLists и массивами объектов


Я всегда путался между HTMLCollections, объектами и массивами, когда дело доходит до DOM. Например...

  1. в чем разница между document.getElementsByTagName("td") и $("td")?
  2. $("#myTable") и $("td") являются объектами (объекты jQuery). Почему именно консоль.журнал также показывает массив элементов DOM рядом с ними, и они не являются объектами и не массивом?
  3. Что такое неуловимые "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 63

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" все о, и как я могу выбрать один?

Смотрите первую часть моего ответа. Вы не можете выберитеNodeLists, они результат выбор.

насколько я знаю, нет даже способа создать NodeLists программно (т. е. создание пустого и добавление узлов позже), они возвращаются только некоторыми DOM методы/свойства.

0. в чем разница между HTMLCollection и NodeList?

вот некоторые определения для вас.

DOM Level 1 Spec-разные определения объектов:

Интерфейс HTMLCollection

HTMLCollection-это список узлов. К отдельному узлу можно получить доступ либо по порядковому индексу, либо по имени узла или атрибутам id. Примечание: предполагается, что коллекции в HTML DOM быть живым означает, что они автоматически обновляются при изменении базового документа.

DOM Level 3 Spec-NodeList

Интерфейс NodeList

интерфейс NodeList обеспечивает абстракцию упорядоченной коллекции узлов, не определяя и не ограничивая способ реализации этой коллекции. Объекты прописаны в доме живут.

элементы в списке узлов доступны через интегральный показатель, начиная с 0.

таким образом, они оба могут содержать живые данные, что означает, что DOM будет обновляться, когда их значения делают. Они также содержат другой набор функций.

вы заметите, если вы проверите консоль, если вы запустите свои скрипты, что table DOM-элемент, который содержит как childNodesNodeList[2] и childrenHTMLCollection[1]. Почему они разные? Потому что HTMLCollection может содержать только узлы элементов, NodeList также содержит текст узел.

enter image description here

1. В чем разница между document.getElementsByTagName("td") и $("td")?

document.getElementsByTagName("td") возвращает массив элементов DOM (a NodeList),$("td") называется объектом jQuery, который имеет элементы из document.getElementsByTagName("td") по своим свойствам 0,1,2 и т. д. Основное отличие заключается в том, что объект jQuery немного медленнее извлекается, но дает доступ ко всем удобным функциям jQuery.

2. $("#myTable") и $("td") есть объекты (jQuery объекты). Почему это console.log также показывает массив элементов DOM рядом с ними, и они не являются объектами и не массив?

это объекты со своими свойствами 0,1,2 и т. д. набор элементов DOM. Вот простой пример: как это работает:

jsFiddle

    var a = {
        1: "first",
        2: "second"
    }
    alert(a[1]);

3. Что такое неуловимые "NodeLists" все о, и как я могу выбрать один?

вы извлекали их в коде getElementsByClassName и getElementsByTagName как вернуть NodeLists

NodeList

$("td") является расширенным объектом jQuery и имеет методы jQuery, он возвращает объект jquery, содержащий массив объектов html. document.getElementsByTagName("td") является необработанным методом js и возвращает NodeList. эту статью

дополнительная информация

в чем разница между HTMLCollection и NodeList?

A HTMLCollection содержит только узлы-элементы (теги) и NodeList содержит все узлы.

существует четыре типа узлов:

  1. элемента
  2. узел атрибута
  3. текстовый узел
  4. комментарий узел

nodeTypes

пробелы внутри элементов рассматриваются как текст, а текст-как узлы.

рассмотрим следующее:

<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>

Difference between HTMLCollection and a NodeList

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 - это только один тип узлов:

Node << HTMLElement inheritance

узел может быть несколько видов. Наиболее важными из них являются следующие:

  • элемент (1): узел элемента, например <p> или <div>.
  • (2): атрибут элемента. Атрибуты элемента больше не реализуют интерфейс узла в спецификации DOM4!
  • текст (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];
}