2008-12-19 18 views
10

Ustawiłem wiele akordeonów na stronie za pomocą wtyczki jonowej akordeonu, dzięki czemu mogę wdrożyć rozwinąć wszystkie i zwinąć wszystkie funkcje.Akordeon jquery Zamknij, a następnie otwórz

Każdy element ID jest to własny akordeon i poniżej kod działa, aby zamknąć je wszystkie bez względu na to, które z nich są już otwarte:

$("#contact, #address, #email, #sales, #equipment, #notes, #marketingdata") 
    .accordion("activate", -1) 
; 

Mój problem jest z poszerzyć wszystko. Kiedy mam je wszystkie rozwinąć z tym kodem:

$("#contact, #address, #email, #sales, #equipment, #notes, #marketingdata") 
    .accordion("activate", 0) 
; 

Some umowa, a niektóre będą rozszerzać na podstawie tego, czy są one uprzednio otwarte.

Mój pomysł na poprawienie tego polegał na zwinięciu wszystkich, a następnie rozwinięciu ich wszystkich po kliknięciu rozwinięcia. Kod ten jednak nie wykona poprawnie:

$("#contact, #address, #email, #sales, #equipment, #notes, #marketingdata") 
    .accordion("activate", -1) 
; 
$("#contact, #address, #email, #sales, #equipment, #notes, #marketingdata") 
    .accordion("activate", 0) 
; 

on trafi tylko drugą komendę i nie zamknąć je wszystkie w pierwszej kolejności. Jakieś sugestie?

Odpowiedz

32

Nie jestem do końca pewien, o co nam chodzi, ale to moje najlepsze przypuszczenie. Spośród wszystkich akordeonów, potrzebujesz przycisku "otwórz wszystko", aby otworzyć wszystkie akordeony, które są zamknięte (to znaczy, żadna sekcja się nie pokazuje). Zrobiłbym że korzystając filter()

$("#contact, #address, #email, #sales, #equipment, #notes, #marketingdata") 
    .filter(":not(:has(.selected))") 
    .accordion("activate", 0) 
; 

Czy to właśnie było po?


Edytuj, aby wyjaśnić tę funkcję filtra:

Funkcja filtr działa tylko na bieżące zaznaczenie przez filtr, usunięcie wszystkiego, co nie pasuje. Ma dwie różne formy: jedną, w której podajesz zwykłe zapytanie jQuery, tak jak to zrobiłem powyżej, i drugą, w której możesz zdefiniować funkcję do filtrowania. Jeśli funkcja zwróci wartość false, ten element zostanie usunięty.

W tym przypadku zapytanie usuwa wszystko, co nie (:not) ma () dziecko z klasą "wybraną" (.selected). Użyłem tutaj selektora .selected, ponieważ akordeon ten dodaje do aktualnie otwartego panelu.

Jeśli miałeś tylko jeden akordeon lub dałeś akordeonowi jakiś identyfikator, taki jak nazwa klasy, możesz znacznie zmniejszyć cały scenariusz. Powiedzmy, że dla każdego elementu, który chcesz zmienić w akordeon, nadajesz mu klasę "zgody".

$(".accord:not(:has(.selected))").accordion("activate", 0); 

Jest to o wiele bardziej czytelne i utrzymaniu, ponieważ można łatwo dodać więcej akordeony w przyszłości, jeśli chcesz i będzie ją obsługiwać.

Dokumentacja dla filtra jest tutaj: http://docs.jquery.com/Traversing/filter

+0

Wow! To idealne!Czy możesz mi wytłumaczyć linię kodu filtra? Działa świetnie, ale naprawdę chciałbym zrozumieć, co robi w przyszłości (jestem nowy w jquery). Dzięki za pomoc! Jon – Jon

+0

Świetne wyjaśnienie! To będzie duża pomoc w przyszłości. – Jon

+0

nickf - świetne wyjaśnienie! Nie widziałem wcześniej takich filtrów zagnieżdżonych. Bardzo pouczający. –

0

miałem ten sam problem i rozwiązać go z jakiegoś krótkiego kodu to dzięki wykorzystaniu poszczególnych funkcji jQuery(), aby zwinąć podczas ustawiania ostrości do pozycji [0] więc normalne nawigacyjnego wznawianie.

http://spstring.jeffthink.com/?p=49

2
jQuery('#accordion').accordion({   
    active:-1, 
}); 
+0

dzięki jej pracy w porządku. –

Powiązane problemy