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, firstChildusa la NodeList childNodese firstElementChildusa children. Sto basando questo presupposto sul riferimento MDN:
childNodeè un riferimento al primo elemento figlio del nodo elemento, onullse 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' childrenoggetto è già in memoria comunque.
Ciò che mi lancia è l' childNodesoggetto. L'ho usato per dare un'occhiata a un modulo, in un elemento tabella. Mentre childrenelenca tutti gli elementi del modulo, childNodessembra 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' childNodeselemento 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.