Вопрос

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

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

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

Это было полезно?

Решение

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

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

Это то, чего ты добивался?


Отредактируйте, чтобы объяснить эту функцию фильтра:

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

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

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

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

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

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

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top