2012-11-13 11 views
10

In JavaScript, c'è un modo per aggiungere un array di nodi figlio a un nodo genitore in un'unica operazione?Come posso aggiungere un array di nodi figlio a un nodo genitore in un'unica operazione utilizzando JavaScript?

Desidero eseguire questa operazione in un'unica operazione per evitare inutili riduzioni.

Ho provato il genitore .appendChild(arrayOfNodes), ma questo fornisce un'eccezione.

Sto creando un piccolo componente che verrà riutilizzato tra diversi progetti, non voglio dipendere da alcuna libreria come jQuery o Zepto.

+1

Solo per curiosità (a meno che non si tratti di un vincolo di progetto) perché no ** jQuery **? – adamb

+0

Sto facendo un compoent riutilizzabile, e posso credere che jQuery o Zepto siano usati in quel progetto, quindi deve essere JavaScript standard –

risposta

1

Si potrebbe aggiungere un metodo per Node, che chiama il metodo appendChild internamente:

(function() { 
    Node.prototype.appendChildren(arrayOfNodes) { 
    var length = arrayOfNodes.length; 
    for (var i = 0; i < length; i++) { 
     this.appendChild(arrayOfNodes[i]); 
    } 
    }()); 

che sarebbe poi utilizzabile in questo modo:

node.appendChildren(arrayOfNodes) 
+0

'Node.prototype' non esiste in IE <9. –

9

si potrebbe usare un intermedio DocumentFragment, che è un po 'contorto, ma è probabile che funzioni meglio di un nodo alla volta se si aggiungono nodi appena creati a un nodo esistente all'interno del documento:

var frag = document.createDocumentFragment(); 
for (var i = 0; i < arrayOfNodes.length; ++i) { 
    frag.appendChild(arrayOfNodes[i]); 
} 
someElement.appendChild(frag); 
+0

Sono carina sicuro di voler fare un po 'di Element.appendChild (frag.cloneNode (true)). Non so perché, ma è quello che dice John Resig, e sono propenso a fidarmi di lui. – hobberwickey

+0

@hobberwickey: Non lo sono, ma non posso immaginare che lo consiglierebbe comunque qui: non c'è bisogno di clonare, e se ci sono gestori di eventi sui nodi inseriti, l'inserimento di cloni è decisamente sbagliato. –

+0

@hobberwickey: l'unico motivo per clonare sarebbe se si desidera inserire più copie dello stesso set di nodi nel documento, che non è necessario qui. L'articolo di Resig non è chiaro su questo punto, sfortunatamente. –

1

So che questo è un po 'vecchio ma ho avuto una domanda simile. Ho deciso di scrivere una semplice funzione che accetta un nodo genitore (nodi) e figli (nodoList o array di nodi), non estendere alcun prototipo o renderlo più complicato di quanto pensavo dovesse essere ...

function appendChildren(parent, children) { 
    for (var i=0; i<children.length;i++) { 
     child = children[i]; 
     parent.appendChild(child); 
    } 
    return parent; 
} 
+0

Basta aggiungere questo 'Element.prototype.appendChildren = appendChildren;' e rimuovere 'parent' arg, sarà' this' – Guja1501

Problemi correlati