2011-02-28 27 views
30

Bir grup öğeyi jquery seçicilerini kullanarak döngü yaparken, koleksiyonda kaç öğe olduğunu öğrenmek için bir yol var mı?

cevap

76

Eğer zincirleme sözdizimi kullanıyorsanız .

(Mantıksız yolu. Seçiciyi tekrar ve index kullanmanızı gerektirir) Ama bu each içinde aradığınız işlevine toplama kullanılabilir hale getirmek için kolay yeterli. İşte bunu yapmak için bir yol var: Bir dizide için jQuery nesnesi dönüştürmek ve daha sonra kullanabilirsiniz, biraz dolambaçlı seçenek olarak

var collection = $(".class"); 
collection.each(function() { 
    // You can access `collection.length` here. 
}); 

dizisi en forEach.

$(".class").get().forEach(function(entry, index, array) { 
    // Here, array.length is the total number of items 
}); 
: forEach 'in geri arama için geçmiş olsun argümanlar (jQuery ikinci argüman this olarak ve sıra sana verdiği) ziyaret edilen giriş, o giriş endeksi ve onu çağırdı dizi vardır

Bu, en az muğlak modern JavaScript motoru ve/veya Array#forEach için bir shim varsayar.

Ya da hatta

Kendine yeni bir araç vermek:

// Loop through the jQuery set calling the callback: 
// loop(callback, thisArg); 
// Callback gets called with `this` set to `thisArg` unless `thisArg` 
// is falsey, in which case `this` will be the element being visited. 
// Arguments to callback are `element`, `index`, and `set`, where 
// `element` is the element being visited, `index` is its index in the 
// set, and `set` is the jQuery set `loop` was called on. 
// Callback's return value is ignored unless it's `=== false`, in which case 
// it stops the loop. 
$.fn.loop = function(callback, thisArg) { 
    var me = this; 
    return this.each(function(index, element) { 
     return callback.call(thisArg || element, element, index, me); 
    }); 
}; 

Kullanımı:

$(".class").loop(function(element, index, set) { 
    // Here, set.length is the length of the set 
}); 
+1

Veya, 'length' değerinin kendisini dış alanda saklayın. –

+0

@Matt: Ama bunu yapmak için, ve ayrıca "her" yi çağırmak için, en azından koleksiyonun kendisini en azından geçici olarak depolamaya ihtiyacım var.Ve neden * yapma *? –

+1

Evet, tek çözüm. JQuery'nin koleksiyona geri bildirime fazladan bir argüman vermesi gerektiğini her zaman düşündüm. – lonesomeday

1

length veya size() mu demek istediniz?

Refs: http://api.jquery.com/length/

+1

Sanırım, ** döngü içinde ** demek. –

+1

uzunluğu bir özellik değil, bir işlevdir. size() boyu döndüren bir işlevdir. – Orbit

+0

@Matt "döngüde iken". Yine de böyle bir özelliğin çok pratik bir kullanım sağlayacağından emin değilim. –

3

.length özelliğini kullanın. Bir fonksiyon değil.

$(".class").each(function() { 
    // ... 
}); 

... Orada kaç nesne bilmek each işlev içinde kodu için herhangi (makul) bir yolu vardır sanmıyorum:

alert($('.class').length); // alerts a nonnegative number 
+0

Teşekkürler, bunu yukarıda belirtildiği gibi düzeltdim. – kojiro

3

sizsiniz jQuery bir sürümünü kullanıyorsanız sürümü 1.8 Eğer $ kullanabilirsiniz daha az ('.class'). sıfır parametresini alan boyut(). .size() yöntemi hakkında daha fazla bilgi için bkz. documentation.

Ancak 1,8 veya daha büyük bir süreyi kullanıyorsanız (veya yükseltmeyi planlıyorsanız) $ ('. Class'). Length özelliğini kullanabilirsiniz. .length özelliği hakkında daha fazla bilgi için bkz. documentation.