2010-12-15 4 views
1

Voici ma structure HTMLAjouter ou supprimer la classe de tous les Li dans une liste non ordonnée, sauf la li actuelle avec jQuery

<ul class="checklist"> 
    <li class="opaque"><a href="">Link</a></li> 
    <li class="transparent"><a href="">Link</a></li> 
    <li class="transparent"><a href="">Link</a></li> 
</ul> 

Lorsque je clique sur l'ancre dans l'un que je veux de la li transparent pour le mettre à opaque et tous les autres li dans le ul à transparent.

Des idées sur la façon de le faire efficacement?

Répondre

7

Vous pouvez faire quelque chose comme ceci:

$('document').ready(function(){ 
    $('ul.checklist').find('a').click(function(){ 
    $(this) 
     .parent().addClass('opaque').removeClass('transparent') 
     .siblings().addClass('transparent').removeClass('opaque'); 
    }); 
}); 

Mais si vous êtes vraiment que représentant deux états qui se produisent jamais ensemble, pourquoi ne pas simplement utiliser une classe , dont l'absence représente le second état? Ensuite, vous auriez ceci:

$('document').ready(function(){ 
    $('ul.checklist').find('a').click(function(){ 
    $(this) 
     .parent().addClass('opaque') 
     .siblings().removeClass('opaque'); 
    }); 
}); 
+0

+1 pour l'analyse d'état –

+0

+1 pour le point d'environ 2 états; Je suggère également d'utiliser 'nearest' avec' find' (au lieu de 'parent'), ou de ne pas utiliser' find'. Je recommande d'appliquer la récursivité de manière cohérente (c'est-à-dire partout ou pas où) dans des cas comme celui-ci –

0

Quelque chose comme ceci:

$('.checklist a').click(function(){ 
    $(this).closest('li') // get current LI 
     .removeClass('transparent') 
     .addClass('opaque') 
     .siblings() // get adjacent LIs 
     .removeClass('opaque') 
     .addClass('transparent'); 
}); 
+1

meilleur sélecteur serait '.checklist> li>' li' autrement a' est redondant –

+0

bon point, merci, Shane –

0

Que diriez-vous de cette solution:

$("li.transparent a").bind("click", function(){ 
    $("ul.checklist li").attr("class", "transparent"); 
    $(this).parent().attr("class", "opaque"); 
}); 
+0

Je suggérerais d'utiliser 'addClass' /' removeClass' au lieu de 'attr'. Le code est plus simple et gère d'autres cas (par exemple, plusieurs classes sans rapport avec le problème en cours) –

+0

Oui, cela a fait l'affaire. Merci beaucoup! – Daelan

+0

@Micheal Habituellement j'utilise add/removeClass mais dans ce cas je pensais que dans ce cas supprimer toutes les classes css pourrait être plus utile. – Luca

Questions connexes