2013-05-16 11 views
8

Czy można to zrobić w bardziej zwięzły sposób?Czy istnieje szybki sposób na zawijanie jQuery wokół każdego elementu w tablicy?

var src = $('div'); 
var dest = []; 

for (var i = 0; i < src.length; i++) 
    dest[i] = $(src[i]); 

mogę myśleć tylko o tym, co jest wciąż dość gadatliwy:

var dest = []; 
$('div').each(function() { dest.push($(this)); }); 

Czy jQuery zaoferować coś lepszego w tym przypadku? Nie mogę tego znaleźć.


Aby rozwiązać niektóre z powtarzających się pytań w komentarzach:

src[i] jest już obiekt jQuery, nazywając jQuery(src[i]) nic nie robi.

Nie, to zwykły węzeł DOM, bez żadnych zawijań jQuery.

Po prostu z ciekawości, dlaczego w ogóle to robisz?

Bo potem będę musiał zrobić sporo faszerowania każdym elementem osobno. Na przykład, muszę przejrzeć wszystkie, aby znaleźć najwyższy, a następnie ustawić pozostałe na tej samej wysokości. Potem muszę uzyskać wszystkie ich szerokości i wykonać na nich pewne układy (więc każdy element otrzymuje swoje współrzędne x & y oparte na szerokościach innych elementów). Itp

Wszystkie te zabiegi są wykonywane łatwiej, jeśli mogę użyć skrótowym funkcje przewidziane przez jQuery, ale to oznacza, że ​​muszę owinąć każdy element osobno ($('div') zwracane tylko otoki wokół wszystko z nich). A ponieważ muszę odwiedzać każdy element wiele razy, chciałbym zwiększyć wydajność, opakowując każdą z nich tylko raz, a nie przy każdej wizycie.

+0

'src [i] 'jest już obiektem jQuery, a wywołanie' jQuery (src [i]) 'nic nie robi. – Barmar

+0

'$ .map ($ (" div "), funkcja (val, i) {return $ (val);}' maybe? –

+1

@Barmar - nie, jest to obiekt DOM z wanilią –

Odpowiedz

8

To jest dokładnie to, do czego służy map(). Zapętlasz każdy element i stosujesz funkcję do elementu i przenosisz go na nową tablicę.

var wrapped = $.map($('div'), function(){ return $(this); }); 

lub dla czytelności

var wrapped = $.map($('div'), function(val, i) { 
    return $(val); 
}); 
+4

FWIW, istnieje również ['map()' na 'jQuery.fn'] (http://api.jquery.com/map/), więc' $ ('div'). Map (funkcja (v, i)); 'działa również. – Matt

+0

@Matt - Sweet. Otrzymuję obiekt jQuery owijający tablicę obiektów jQuery! Idealny! :) –

1

węzła DOM Nie należy ponownie konwertować do obiektu jQuery.

Powinieneś spróbować czegoś takiego,

var src = $('div'); 
var dest = []; 

for (var i = 0, l = src.length; i < l; i++) { 
    dest[i] = src.eq(i); 
} 

console.log(dest); 

Albo jeszcze lepiej,

var src = document.getElementsByTagName('div'); 
var dest = []; 
for (var i = 0, l = src.length; i < l; i++) { 
    dest[i] = $(src[i]); 
} 
console.log(dest); 


nie jestem bardzo dobry w js perf, ale tutaj jest test http://jsperf.com/eq-vs-vs-vanilla

+0

Miło! Dzięki! :) –

Powiązane problemy