2011-01-28 36 views
9

tengo una pequeña pregunta selectores de jQuery, tengo el siguiente código HTML:jQuery selector - todo menos el primer

<div class="member-info first"></div> 
<div class="member-info"></div> 
<div class="member-info"></div> 

Quiero ocultar (usando jQuery) todos los divs que sostiene el "miembro-info" clase, pero no la que tiene la "primera" clase, ¿algún pensamiento?

+1

posible duplicado de [jQuery seleccionar todos excepto primero] (http://stackoverflow.com/questions/2259393/jquery-select-all-except-first) – bwright

+0

Duplicado de cualquiera [todos los elementos-pero-el-primero ] (https://stackoverflow.com/q/2259393/673991) o [todos los elementos-no-en-una-clase] (https://stackoverflow.com/q/4614120/673991). De cualquier manera, esta pregunta es particularmente confusa nombrando la clase del primer elemento "primero". Entonces las respuestas incluyen '': not (: first)'' and '': not (.first)' 'e incluso'': not (first) ''! –

Respuesta

16
$('.member-info:not(.first)').hide(); 

Este utiliza el not-selector(docs) para excluir elementos con la clase first.

O si el propósito de la clase first es simplemente para identificar la primera, y luego hacer esto en su lugar:

$('.member-info').slice(1).hide(); 

Este utiliza el método slice()(docs) para devolver un conjunto a partir del segundo partido.

+1

+1 slice() va a ser mucho más rápido porque solo está eliminando un elemento de una matriz en lugar de tener que verifique la clase en cada elemento de nuevo. – Keltex

+0

@Keltex: Estoy de acuerdo. Siempre que la clase "primera" siempre esté en el primer partido del conjunto, hacer un corte será el camino a seguir. – user113716

+0

@Keltex cierto, pero se debe elegir el más claro, ya que la selección de clase probablemente no tenga un impacto notable. (Como siempre, cuando se relaciona con el rendimiento, perfil antes y después) – cobbal

2

Esto no responde completamente a su pregunta, pero podría omitir el primer elemento coincidente con gt.

Por ejemplo:

$('div.member-info:gt(0)') 

Ver: http://api.jquery.com/gt-selector/

+0

Gracias @ Jon- este me ayudó mucho. No estoy seguro de por qué los otros no. –

0

esto debería funcionar:

$('.member-info').not('.first').hide(); 

Usando not().

2

Utilice :not() selector. Por ejemplo:

$(".member-info:not(first)").hide(); 

Si primero es realmente siempre el primer hijo, intente

$(".member-info:not(member-info:first)").hide(); 
0

¿qué tal $('.member-info').not('.first').hide();

1

me encontré con este problema también. Sin embargo, no tuve convenientemente una clase llamada first marcando mi elemento para su exclusión. Aquí fue la solución que he usado para el selector en el contexto de este ejemplo:

$('.member-info:not(:first)');//grab all .member-info except the first match 
3
$(".member-info:not('.first')").hide(); 
$(".member-info").filter(":not('.first')").hide(); 
$('.member-info').not('.first').hide(); 

$(".member-info:not(:first)").hide(); 
$(".member-info").filter(":not(':first')").hide(); 
$('.member-info').not(':first').hide(); 

$(".member-info:not(:eq(0))").hide(); 
$(".member-info").filter(":not(':eq(0)')").hide(); 
$(".member-info").not(":eq(0)").hide(); 

$(".member-info:not(:lt(1))").hide(); 
$(".member-info").filter(":not(':lt(1)')").hide(); 
$(".member-info").not(":lt(1)").hide(); 

$(".member-info:gt(0)").hide(); 
$(".member-info").filter(':gt(0)').hide(); 

$(".member-info").slice(1).hide(); 

Todas las formas posibles que vienen a la mente. También hice JavaScript performance comparison donde puede encontrar resultados inesperados.

Todas estas muestras funcionan con v1.10. * De jQuery.

mayoría de las veces éste es el más rápido $(".member-info").slice(1).hide(); y se parece, no respuesta lluvia de ideas relevantes

0

@AuthorProxy, @David Thomas@Maximilian Ehlers y todos sugieren $('.member-info').not('.first').hide(); en sus respuestas, que es una solución muy rápida y muy fácil de leer.

Debido a la forma en que se evalúan los selectores de jQuery derecha a izquierda, el muy legible ".member-info:not(.first)" que realmente está frenado por que la evaluación.

Una solución rápida y fácil de leer es, en efecto usando la versión de función .not(".first") o incluso sólo .not(":first"):

por ejemplo,

$(".member-info").not(".first").hide(); // Class selector 

o

$(".member-info").not(":first").hide(); // Positional selector 

JSPerf de selectores relacionados:http://jsperf.com/fastest-way-to-select-all-expect-the-first-one/6

.not(':first') sólo unos pocos puntos porcentuales más lento que slice(1), pero es muy fácil de leer como "Quiero que todos excepto el primero ".

Cuestiones relacionadas