Jquery Accordion Закрыть, затем Открыть - PullRequest
10 голосов
/ 20 декабря 2008

Я настроил несколько аккордеонов на странице с помощью плагина jquery accordion, чтобы я мог реализовать функцию развернуть все и свернуть все функции.

Каждый элемент ID является собственным аккордеоном, и приведенный ниже код работает, чтобы закрыть их все, независимо от того, какие из них уже открыты:

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

Моя проблема с расширением всего. Когда они у меня появятся, добавьте следующий код:

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

Некоторые будут заключать контракты, а некоторые будут расширяться в зависимости от того, открыты они ранее или нет.

Моя идея исправить это состояла в том, чтобы свернуть их все, а затем развернуть их все, когда была нажата кнопка развернуть все. Однако этот код не будет выполняться должным образом:

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

Он ударит только по второй команде и не закроет их всех первым. Есть предложения?

Ответы [ 3 ]

32 голосов
/ 20 декабря 2008

Я не совсем уверен, что вы ищете, но это мое лучшее предположение. Из всех ваших аккордеонов, вы хотите, чтобы кнопка «открыть все» открывала все закрытые аккордеоны (то есть ни одна секция не показывается). Я бы сделал это, используя filter()

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

Это то, что вы были после?


Изменить, чтобы объяснить эту функцию фильтра:

Функция фильтра просто пропускает ваш текущий выбор через фильтр, удаляя все, что не соответствует. Он имеет две разные формы: одну, где вы передаете обычный запрос jQuery, как я делал выше, и другую, где вы можете определить функцию для фильтрации. Если функция возвращает false, этот элемент удаляется.

В этом случае запрос удаляет все, что не имеет (:not) (:has) дочернего элемента с классом «selected» (.selected). Здесь я использовал селектор .selected, потому что это то, что аккордеон добавляет к открытой в данный момент панели.

Если у вас был только один аккордеон, или вы дали каждому из ваших аккордеонов какой-то идентификатор, такой как имя класса, то вы могли бы значительно сократить весь скрипт. Допустим, для каждого элемента, который вы хотите превратить в аккордеон, вы присваиваете ему класс «accord».

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

Это гораздо более разборчиво и легко обслуживаемо, так как вы можете легко добавить больше аккордеонов в будущем, если захотите, и это с этим справится.

Документация для фильтра находится здесь: http://docs.jquery.com/Traversing/filter

2 голосов
/ 23 октября 2010
jQuery('#accordion').accordion({        
    active:-1,
});
0 голосов
/ 09 марта 2009

У меня была такая же проблема, и я решил ее с помощью небольшого кода, использующего функцию each () JQuery для свертывания при установке фокуса на item [0], чтобы возобновить нормальную навигацию.

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

...