Sempre me confundi entre HTMLCollections, objects e arrays quando se trata de DOM. Por exemplo...
- Qual é a diferença entre
document.getElementsByTagName("td")
e$("td")
? $("#myTable")
e$("td")
são objetos (objetos jQuery). Por que o console.log também mostra a matriz de elementos DOM ao lado deles, e eles não são objetos e não são uma matriz?- O que são as elusivas "NodeLists" e como faço para selecionar uma?
Forneça também qualquer interpretação do script abaixo.
Obrigado
[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
fonte
fonte
document.querySelectorAll('td')
e$('td')
. (b) A diferença fundamental é que jQuery trabalha com seu próprio tipo de objeto que contém, entre outras coisas, uma coleção numerada de elementos HTML; essa coleção não é nenhuma das anteriores, e o objeto jQuery é essencialmente um invólucro em torno dos verdadeiros elementos DOM.Respostas:
Primeiro vou explicar a diferença entre
NodeList
eHTMLCollection
.Ambas as interfaces são coleções de nós DOM. Eles diferem nos métodos que fornecem e no tipo de nós que podem conter. Embora a
NodeList
possa conter qualquer tipo de nó, umHTMLCollection
deve conter apenas nós de elemento.Um
HTMLCollection
fornece os mesmos métodos que umNodeList
e, adicionalmente, um método chamadonamedItem
.As coleções são sempre usadas quando o acesso deve ser fornecido a vários nós, por exemplo, a maioria dos métodos seletores (como
getElementsByTagName
) retorna vários nós ou obtendo uma referência para todos os filhos (element.childNodes
).Para obter mais informações, dê uma olhada na especificação DOM4 - Coleções .
getElementsByTagName
é o método da interface DOM. Ele aceita um nome de tag como entrada e retorna umHTMLCollection
(consulte a especificação DOM4 ).$("td")
é presumivelmente jQuery. Ele aceita qualquer seletor CSS / jQuery válido e retorna um objeto jQuery.A maior diferença entre as coleções DOM padrão e as seleções jQuery é que as coleções DOM são tipicamente ativas (nem todos os métodos retornam uma coleção ativa), ou seja, quaisquer alterações no DOM são refletidas nas coleções se forem afetadas. Eles são como uma visualização na árvore DOM, enquanto as seleções do jQuery são instantâneos da árvore DOM no momento em que a função foi chamada.
Os objetos jQuery são objetos do tipo array , ou seja, eles têm propriedades numéricas e uma
length
propriedade (tenha em mente que os arrays são apenas objetos em si). Os navegadores tendem a exibir matrizes e objetos semelhantes a matrizes de uma maneira especial, como[ ... , ... , ... ]
.Veja a primeira parte da minha resposta. Você não pode selecionar
NodeList
s, eles são o resultado de uma seleção.Pelo que eu sei, não há nem mesmo uma maneira de criar
NodeList
s programaticamente (ou seja, criar um vazio e adicionar nós mais tarde), eles são retornados apenas por alguns métodos / propriedades DOM.fonte
td
elementos, adicionar um novotd
elemento posteriormente não atualizará a seleção automaticamente para conter o novo elemento.NodeList
s estão vivos..forEach()
e o outro não?0. Qual é a diferença entre um
HTMLCollection
e umNodeList
?Aqui estão algumas definições para você.
Especificação de DOM nível 1 - Definições de objetos diversos :
Especificação DOM nível 3 - NodeList
Portanto, ambos podem conter dados ativos, o que significa que o DOM será atualizado quando seus valores forem atualizados. Eles também contêm um conjunto diferente de funções.
Você notará se inspecionar o console se executar seus scripts, que o
table
elemento DOM contém achildNodes
NodeList[2]
e achildren
HTMLCollection[1]
. Por que eles são diferentes? ComoHTMLCollection
só pode conter nós de elemento, NodeList também contém um nó de texto.1. Qual é a diferença entre
document.getElementsByTagName("td")
e$("td")
?document.getElementsByTagName("td")
Retorna uma matriz de elementos DOM (aNodeList
),$("td")
é chamado um objeto jQuery que tem os elementos a partirdocument.getElementsByTagName("td")
das suas propriedades0
,1
,2
, etc. A principal diferença é que o objeto jQuery é um pouco mais lento para recuperar, mas dá acesso a toda a calhar funções jQuery.2.
$("#myTable")
e$("td")
são objetos (jQuery
objetos). Por queconsole.log
também está mostrando a matriz de elementos DOM ao lado deles, e eles não são objetos e não são uma matriz?Eles são objetos com suas propriedades
0
,1
,2
, etc. conjunto com os elementos DOM. Aqui está um exemplo simples: de como funciona:jsFiddle
3. O que são as elusivas "NodeLists" e como faço para selecionar uma?
Você os recuperou em seu código
getElementsByClassName
egetElementsByTagName
ambos retornamNodeList
sfonte
length
propriedade, não dos nomes numéricos das propriedades. E com o que seu exemplo de alertar uma string tem a verconsole.log
?Nota adicional
Qual é a diferença entre um HTMLCollection e um NodeList?
Um HTMLCollection contém apenas nós de elemento ( tags ) e um NodeList contém todos os nós .
Existem quatro tipos de nós:
nodeTypes
Espaços em branco dentro dos elementos são considerados texto e o texto é considerado nós.
Considere o seguinte:
Espaço em branco:
<ul id="myList"> <li>List item</li></ul>
Sem espaço em branco:
<ul id="myList"><li>List item</li></ul>
fonte
$("td")
é um objeto jQuery estendido e tem métodos jQuery, ele retorna o objeto jquery que contém uma matriz de objetos html.document.getElementsByTagName("td")
é o método js bruto e retorna NodeList. Veja este artigofonte
Os objetos NodeList são coleções de Node, retornados por exemplo por x. propriedade childNodes ou método document.querySelectorAll () . Em alguns casos, o NodeList é ao vivo , o que significa que as mudanças no DOM atualizar automaticamente a coleção! Por exemplo, Node.childNodes está ativo:
Mas, em alguns outros casos, o NodeList é estático , onde qualquer mudança no DOM não afeta o conteúdo da coleção. querySelectorAll () retorna uma NodeList estática.
O HTMLCollection é uma coleção ativa e ordenada de elementos (é atualizada automaticamente quando o documento subjacente é alterado). Pode ser o resultado de propriedades como filhos ou métodos como document.getElementsByTagName () , e só pode ter HTMLElements como seus itens.
HTMLCollection também expõe seus membros diretamente como propriedades por nome e índice:
O HTMLElement é apenas um tipo de nós:
O Nó pode ser de vários tipos . Os mais importantes são os seguintes:
<p>
ou<div>
.Portanto, uma grande diferença é que HTMLCollection contém apenas HTMLElements, mas NodeList também contém os comentários, textos de espaço em branco (caracteres de retorno de carro, espaços ..), etc. Verifique como no seguinte trecho:
HTMLCollection e NodeList contêm a propriedade length que você pode usar para fazer um loop sobre seus itens. Não use for ... in ou for each ... in para enumerar os itens em NodeLists, visto que eles também enumerarão suas propriedades de comprimento e item e causarão erros se seu script assumir que ele só precisa lidar com objetos de elemento. Além disso, for..in não tem garantia de visitar as propriedades em nenhuma ordem específica.
fonte
Muito já foi dito, mas pensei que uma versão mais resumida da resposta com um exemplo para explicar as diferenças entre
HTMLCollection
eNodeList
ajudaria.Tipos de nós em DOM
Podemos usar as três propriedades a seguir para inspecionar e perguntar sobre nós no DOM:
nodeType
PropriedadenodeName
PropriedadenodeValue
PropriedadeA
nodeType
propriedade retorna o tipo de nó, como um número, do nó especificado.nodeType
propriedade retornará 1 .nodeType
propriedade retornará 2 .nodeType
propriedade retornará 3 .nodeType
propriedade retornará 8 .HTMLCollection vs NodeList
Podemos entender as diferenças entre
HTMLCollection
eNodeList
mais claramente com o exemplo a seguir. Por favor, tente verificar os resultados no console do seu próprio navegador para ter um melhor entendimento.fonte