2012-07-20 14 views
5

Digamos que tengo un <dl> con todos los <dd> s escondidos. Al hacer clic en un <dt> alterna el <dd> s que le siguen usando el siguiente código:¿Cómo selecciono los hermanos() de múltiples elementos?

$(this).nextUntil('dt').toggle(); 

http://jsfiddle.net/mblase75/FZQj7/

Ahora, yo quiero ocultar automáticamente el <dd> s después de los otros <dt> s, por lo que tratan de captar la hermanos con este código:

$(this).nextUntil('dt').toggle() 
    .siblings().filter('dd').hide(); 

http://jsfiddle.net/mblase75/FZQj7/1/

Pero no ocurre nada, porque cada <dd> que ya he seleccionado con .nextUntil es un hermano entre sí. Como resultado, están todos ocultos y no se muestra nada.

Debe haber una forma compacta de decirle a jQuery que seleccione todos los hermanos EXCEPTO los que ya he seleccionado, pero no puedo verlo. Ideas?

Respuesta

2

que podría hacerlo desde la matriz:

$('dt').on('click',function() { 
    $(this).nextUntil('dt').toggle().siblings("dt").not(this).nextUntil('dt').hide(); 
});​ 

http://jsfiddle.net/FZQj7/7/

+0

inteligente pensamiento lateral allí. Por cierto, puedes acortar '.parent(). Find (" dt ")' a 'siblings ('dt')', que no me di cuenta antes de que lo hiciera lbstr. – Blazemonger

+0

@Blazemonger Tomaría algo más que simplemente cambiar esos dos métodos a .siblings(), http://jsfiddle.net/FZQj7/13/ –

+0

Esta es la solución que estoy usando: http://jsfiddle.net/mblase75/FZQj7/14/- preferido sobre los demás debido a su elegancia y encadenamiento de línea única. – Blazemonger

3

¿Qué le parece esto? Observe el uso de la función not, which you can read about here.

http://jsfiddle.net/lbstr/FZQj7/6/

$('dt').on('click',function() { 
    var $this = $(this), 
     $firstGroup = $this.nextUntil('dt'); 
    $firstGroup.toggle(); 
    $this.siblings('dd').not($firstGroup).hide(); 
});​ 
+0

Sí, simplemente pensó que yo mismo. Estaba a punto de publicarlo pero me ganaste. – Blazemonger

+0

@Blazemonger ¡Lo hago todo el tiempo! Solo un pensamiento ... ¿Tiene sentido en tu caso que todos los elementos 'dd' y' dt' sean hermanos? Parece que podría tener más sentido sintácticamente hacer que se agrupen en su propio 'dl's. Y haría que este problema fuera mucho más fácil de resolver. – lbstr

+0

Bueno, en realidad estoy mostrando y ocultando filas de tablas: utilicé una lista de definiciones solo para el ejemplo porque es un código más simple. – Blazemonger

1

Una solución sencilla es aplicar una clase a los elementos que mostrar. En cada clic, puede ocultar los elementos con esta clase antes de mostrar el conjunto deseado.

http://jsfiddle.net/FZQj7/11/

$('dt').on('click',function() { 
    $('.visibledd').hide().removeClass('visibledd'); 
    $(this) 
     .nextUntil('dt') 
     .toggle() 
     .addClass('visibledd'); 
});​ 
+0

Me gusta esta idea, pero no permitirá colapsar el grupo 'dd' haciendo clic en su' dt' de nuevo. – lbstr

0

Aquí es algo un poco más simple que estos otros:

$('dt').on('click',function() { 
    $(this).siblings('dd').hide(); 
    $(this).nextUntil('dt').show(); 
}); 
+0

Esto no funcionará porque entonces no puedo ocultar todos los '

' s con un segundo clic en el mismo '
'. – Blazemonger

+0

lo siento. Parece que entendí mal el requisito ... – ShaneBlake

Cuestiones relacionadas