2010-12-15 4 views
1

Hier ist meine HTML-StrukturHinzufügen oder Entfernen von Klasse von allen li in einer ungeordneten Liste mit Ausnahme des aktuell li mit 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> 

Wenn ich innerhalb von einem der transparenten li den Anker klicken ich es opaque festlegen möge und alle anderen li's innerhalb der ul bis transparent.

Irgendwelche Ideen, wie man das effizient macht?

Antwort

7

Sie können etwas tun:

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

Aber wenn Sie wirklich nur zwei Zustände darstellen, die nie zusammen kommen, warum nicht nur eine Klasse verwenden , dessen Abwesenheit den zweiten Zustand darstellt? Dann würden Sie dieses:

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

+1 für die Zustandsanalyse –

+0

+1 für den Punkt von ungefähr 2 Zuständen; Ich würde auch vorschlagen, 'am nächsten' mit 'finden' (anstelle von 'Eltern') zu verwenden, oder nicht mit 'finden'. Ich empfehle, die Rekursion konsistent anzuwenden (d. H. Überall oder nirgendwo). In Fällen wie diesem –

0

Etwas wie folgt aus:

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

besser Wähler wäre '.checklist> li> a' sonst' li' redundant ist –

+0

guter Punkt, danke, Shane –

0

Wie über diese Lösung:

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

würde ich vorschlagen, 'addClass' /' removeClass' anstelle von 'attr' zu verwenden. Der Code ist einfacher und behandelt andere Fälle (z. B. mehrere Klassen, die nichts mit dem vorliegenden Problem zu tun haben) –

+0

Ja, das hat den Trick gemacht. Vielen Dank! – Daelan

+0

@Micheal Normalerweise verwende ich add/removeClass, aber in diesem Fall dachte ich, dass in diesem Fall das Entfernen aller CSS-Klassen nützlicher sein könnte. – Luca

Verwandte Themen