Mi chiedevo, JavaScript offre una varietà di metodi per ottenere il primo elemento figlio da qualsiasi elemento, ma qual è il migliore? Per meglio, intendo: la maggior parte compatibile con più browser, più veloce, più completa e prevedibile quando si tratta di comportamento. Un elenco di metodi / proprietà che utilizzo come alias:
var elem = document.getElementById('container');
var child = elem.children[0];
var child = elem.firstElementChild; // == children[0]
Questo funziona per entrambi i casi:
var child = elem.childNodes[0]; // or childNodes[1], see below
Questo è in caso di forme o <div>
iterazioni. Se potessi incontrare elementi di testo:
var child = elem.childNodes; // treat as NodeList
var child = elem.firstChild;
Per quanto ne so, firstChild
usa la NodeList childNodes
e firstElementChild
usa children
. Sto basando questo presupposto sul riferimento MDN:
childNode
è un riferimento al primo elemento figlio del nodo elemento, onull
se non ce n'è uno.
Immagino che, in termini di velocità, la differenza, se presente, non sarà quasi nulla, dal momento che firstElementChild
è effettivamente un riferimento a children[0]
, e l' children
oggetto è già in memoria comunque.
Ciò che mi lancia è l' childNodes
oggetto. L'ho usato per dare un'occhiata a un modulo, in un elemento tabella. Mentre children
elenca tutti gli elementi del modulo, childNodes
sembra includere anche gli spazi bianchi dal codice HTML:
console.log(elem.childNodes[0]);
console.log(elem.firstChild);
Entrambi i registri <TextNode textContent="\n ">
console.log(elem.childNodes[1]);
console.log(elem.children[0]);
console.log(elem.firstElementChild);
Tutti i log <input type="text"
... >
. Come mai? Comprenderei che un oggetto mi consentirebbe di lavorare con il codice HTML "grezzo", mentre l'altro si attacca al DOM, ma l' childNodes
elemento sembra funzionare su entrambi i livelli.
Per tornare alla mia domanda iniziale, la mia ipotesi sarebbe: se voglio l'oggetto più completo, childNodes
è la strada da percorrere, ma a causa della sua completezza, potrebbe non essere il più prevedibile in termini di restituzione dell'elemento che voglio / aspettarsi in qualsiasi momento. Il supporto cross-browser potrebbe anche rivelarsi una sfida in quel caso, anche se potrei sbagliarmi.
Qualcuno potrebbe chiarire la distinzione tra gli oggetti a portata di mano? Se c'è una differenza di velocità, per quanto trascurabile, vorrei saperlo anche io. Se vedo tutto sbagliato, sentiti libero di educarmi.
PS: Per favore, per favore, mi piace JavaScript, quindi sì, voglio occuparmi di questo genere di cose. Risposte come "jQuery si occupa di questo per te" non sono quello che sto cercando, quindi nojquery etichetta.