Подтвердить что ты не робот

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

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

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

Просьба также предоставить любую интерпретацию ниже script.

Спасибо

[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>
4b9b3361

Ответ 1

Сначала я объясню разницу между NodeList и HTMLCollection.

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

Коллекции всегда используются, когда доступ должен предоставляться нескольким узлам, например. большинство методов выбора (например, getElementsByTagName) возвращают несколько узлов или получают ссылку на всех дочерних элементов ( element.childNodes).

Для получения дополнительной информации см. спецификация DOM4 - коллекции.

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

getElementsByTagName - это метод интерфейса DOM. Он принимает имя тега как ввод и возвращает HTMLCollection (см. спецификация DOM4).

$( "td" ) предположительно jQuery. Он принимает любой допустимый селектор CSS/jQuery и возвращает объект jQuery.

Самые большие различия между стандартными коллекциями DOM и выборами jQuery заключаются в том, что коллекции DOM обычно живут (не все методы возвращают живую коллекцию, хотя), то есть любые изменения в DOM отражаются в коллекциях, если они затронуты. Они похожи на представление в дереве DOM, тогда как выбор jQuery - это моментальные снимки дерева DOM в момент вызова функции.

Почему console.log также показывает массив элементов DOM рядом с ними и не являются ли они объектами, а не массивом?

Объектами jQuery являются объекты array-like, то есть они имеют числовые свойства и свойство length (имейте в виду, что массивы - это сами объекты). Браузеры, как правило, отображают массивы и подобные массиву объекты, например [...,...,...].

Что такое неуловимые "NodeLists" и как его выбрать?

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

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

Ответ 2

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

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

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

Интерфейс HTMLCollection

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

DOM Level 3 Spec - NodeList

Интерфейс NodeList

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

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

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

Вы заметите, если вы проверите консоль, если вы запустите свои скрипты, чтобы элемент table DOM содержал как childNodes NodeList[2], так и children HTMLCollection[1]. Почему они разные? Поскольку HTMLCollection может содержать только узлы элементов, NodeList также содержит текст node.

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 оба возвращали NodeList s

NodeList

Ответ 3

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