2011-02-28 41 views
30

Al alternar sobre un grupo de elementos utilizando los selectores de jquery, ¿hay alguna manera de averiguar cuántos elementos hay en la colección?

Respuesta

76

Si está utilizando la sintaxis encadenada:

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

... no creo que haya ninguna manera (razonable) para el código dentro de la función each saber cuántos elementos hay . (poco razonables formas implicaría repetir el selector y el uso de index.)

Pero es bastante fácil de hacer que la colección a disposición de la función que está llamando en each. Aquí hay una manera de hacerlo:

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

Como una opción un tanto complicado, se puede convertir el objeto jQuery a una matriz y luego usar forEach de la matriz. Los argumentos que van pasando a devolución de llamada forEach 's son la entrada que se visita (lo jQuery que da como this y como segundo argumento ), el índice de esa entrada, y la matriz de la llamaste en:

$(".class").get().forEach(function(entry, index, array) { 
    // Here, array.length is the total number of items 
}); 

Eso supone al menos vagamente motor de JavaScript moderno y/o una calzada para Array#forEach.

O para el caso, darse una nueva herramienta:

// 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); 
    }); 
}; 

Uso:

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

O bien, almacene el valor 'length' en el ámbito externo. –

+0

@Matt: Pero para hacer eso, y también para llamar a "cada uno", igual tendré que almacenar al menos temporalmente la colección.¿Y por qué * no * lo haces? –

+1

Sí, la única solución. Siempre he pensado que jQuery debería proporcionar la colección como un argumento adicional a la devolución de llamada. – lonesomeday

1

¿Quieres decir como length o size()?

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

+1

Creo que quiere decir ** dentro de ** loop. –

+1

longitud es un atributo, no una función. size() es una función que devuelve longitud. – Orbit

+0

@Matt "when looping". Sin embargo, no estoy seguro de que dicha característica tenga mucho uso práctico. –

3

utilizar la propiedad .length. Es no una función.

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

Gracias, he corregido mi anterior para reflejar que .length es una propiedad. – kojiro

3

Si está utilizando una versión de jQuery que es menor que la versión 1.8 se puede utilizar el $ ('.class'). size() que toma cero parámetros. Consulte documentation para obtener más información sobre el método .size().

Sin embargo, si está utilizando (o planea actualizar) a 1.8 o superior, puede usar la propiedad $ ('. Class'). Length. Consulte documentation para obtener más información sobre la propiedad .length.

Cuestiones relacionadas