JQuery Accordion Закрыть, затем Открыть

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

Каждый элемент 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)
; 

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

Ответы

Ответ 1

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

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

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


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

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

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

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

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

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

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

Ответ 2

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

Ответ 3

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

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