Ho visto molte discussioni riguardo al modo più veloce per selezionare un primo elemento figlio usando jQuery. Come ci si può aspettare, la proprietà firstChild DOM nativa è molto più veloce dell'utilizzo di un selettore jQuery o di una combinazione di selettori - vedere http://jsperf.com/jquery-first-child-selection-performance/6. Questo di solito non è un problema - o viene utilizzato in un luogo in cui le prestazioni non sono un grosso problema, o è abbastanza facile accedere semplicemente all'elemento DOM e usare la sua proprietà .firstChild. Tuttavia, ci sono un paio di problemi con questo:Perché jQuery non fornisce un metodo .firstChild?
- firstChild potrebbe tornare un nodo di testo o un commento, piuttosto che un elemento, come un selettore jQuery sarebbe tornato
- Se ho bisogno di selezionare il primo figlio di elementi multipli , Devo usare un selettore lento, o andare a un sacco di lavoro extra che itera su elementi DOM, aggiungendoli a una raccolta, quindi rimettendoli in un oggetto jQuery.
Mi sembra che il costo dell'aggiunta di un metodo firstChild alla libreria jQuery di base sarebbe molto inferiore ai vantaggi. Ho preso il mio colpo a creare un tale metodo per il mio uso:
$.fn.firstChild = function() {
var ret = [];
this.each(function() {
var el = this.firstChild;
//the DOM firstChild property could return a text node or comment instead of an element
while (el && el.nodeType != 1)
el = el.nextSibling;
if (el) ret.push(el);
});
//maintain jQuery chaining and end() functionality
return this.pushStack(ret);
};
Nei test che ho creato in http://jsperf.com/jquery-multiple-first-child-selection, questa funzione esegue più di cinque volte più veloce di qualsiasi altra opzione. I test sono basati sui test sopra menzionati, ma selezionano i primi figli di più elementi, piuttosto che un singolo elemento.
C'è qualcosa che mi manca? Una tecnica che dovrei usare? O è un problema di cui non ci si dovrebbe mai preoccupare? C'è un motivo per non includere una funzione come questa in jQuery?
+1, non sapevo su firstElementChild. Per i curiosi, ho trovato una tabella di supporto del browser qui: http://www.quirksmode.org/dom/w3c_traversal.html – undefined
Vorrei anche ricordare che ho aggiunto la funzione firstChild migliorata ai test case jsperf collegati sopra. – undefined
Le persone si sono arrabbiate con me per colpa tua ... :) controlla [questo] (http://meta.stackexchange.com/q/129306/173320). – gdoron