Аккордеон jQuery UI: открывать несколько панелей одновременно

Я пытаюсь создать аккордеон, способный одновременно расширять несколько панелей. Я пытался найти его в jQuery UI API, но пока не нашел подходящего способа.

Пожалуйста, дайте мне знать, есть ли способ сделать это с помощью аккордеона jQuery UI.


person Tarun    schedule 29.03.2013    source источник
comment
Это может помочь: forum.jquery.com/topic/accordion- несколько разделов, открытых одновременно   -  person techfoobar    schedule 29.03.2013
comment
Это невозможно с аккордеоном jQuery UI по дизайну.   -  person Andrei    schedule 29.03.2013
comment
@techfoobar Спасибо за справочный URL. Кажется, у них такая же проблема, но до сих пор нет подходящего решения.   -  person Tarun    schedule 29.03.2013
comment
@ Андрей Я также считаю, что jQuery не предоставляет никакого способа, но я ищу, возможно ли его расширить. Потому что в моем приложении jQuery UI уже реализован для других вещей и для доступности виджетов. Поэтому я не хочу писать код самостоятельно с нуля или использовать какую-либо другую библиотеку.   -  person Tarun    schedule 29.03.2013
comment
проверьте это jsfiddle.net/AR57Y   -  person rajesh kakawat    schedule 29.03.2013
comment
@Rajesh В этом случае он не будет работать в JAWS и других программах чтения с экрана с помощью сочетаний клавиш, единственная причина заключается в использовании пользовательского интерфейса jQuery — это доступность.   -  person Tarun    schedule 01.04.2013
comment
Я улучшил jsfiddle.net/AR57Y, чтобы не прокручивать страницу вверх, если щелкнуть заголовок, но не на значке треугольника: jsfiddle.net/HotFusionMan/y3vN5/1   -  person Al Chou    schedule 12.06.2013


Ответы (3)


Как уже отмечалось, у виджета Accordion нет опции API, чтобы сделать это напрямую. Однако, если вы должны использовать виджет, этого можно добиться с помощью beforeActivate параметр обработчика событий, чтобы изменить и эмулировать поведение виджета по умолчанию.

Например:

$('#accordion').accordion({
    collapsible:true,

    beforeActivate: function(event, ui) {
         // The accordion believes a panel is being opened
        if (ui.newHeader[0]) {
            var currHeader  = ui.newHeader;
            var currContent = currHeader.next('.ui-accordion-content');
         // The accordion believes a panel is being closed
        } else {
            var currHeader  = ui.oldHeader;
            var currContent = currHeader.next('.ui-accordion-content');
        }
         // Since we've changed the default behavior, this detects the actual status
        var isPanelSelected = currHeader.attr('aria-selected') == 'true';

         // Toggle the panel's header
        currHeader.toggleClass('ui-corner-all',isPanelSelected).toggleClass('accordion-header-active ui-state-active ui-corner-top',!isPanelSelected).attr('aria-selected',((!isPanelSelected).toString()));

        // Toggle the panel's icon
        currHeader.children('.ui-icon').toggleClass('ui-icon-triangle-1-e',isPanelSelected).toggleClass('ui-icon-triangle-1-s',!isPanelSelected);

         // Toggle the panel's content
        currContent.toggleClass('accordion-content-active',!isPanelSelected)    
        if (isPanelSelected) { currContent.slideUp(); }  else { currContent.slideDown(); }

        return false; // Cancel the default action
    }
});

См. демонстрацию jsFiddle.

person Boaz - CorporateShillExchange    schedule 29.03.2013
comment
Спасибо, Боаз, я не пробовал, но по вашему сценарию он будет работать со специальными возможностями. - person Tarun; 01.04.2013
comment
@Boaz, эй, я пытался реализовать это на своей странице, и теперь все мои разделы контента всегда имеют одинаковую высоту. Не могу понять, что происходит. stackoverflow.com/questions/29327520/ - person Miha Šušteršič; 29.03.2015
comment
@MihaŠušteršič Ответил в OP. По сути, высота панелей может быть установлена ​​свойством аккордеона styleHeight, которое в вашем случае, вероятно, должно быть styleHeight:'content'. - person Boaz - CorporateShillExchange; 29.03.2015
comment
+1 Работает отлично! В строке: currContent.toggleClass('accordion-content-active',!isPanelSelected) вы пропустили точку с запятой в конце;) - person Philipp; 28.05.2015
comment
Это работает в пользовательском интерфейсе jQuery 1.9.2 (выпущенном в 2012 г.), который используется в примере скрипта. Хотя он все еще работает по крайней мере в 1.10.4, более новые версии пользовательского интерфейса jQuery оставляют открытые панели в наполовину открытом состоянии, когда вы вызываете метод обновления на аккордеоне. (Внутри виджет использует индекс для активной панели, поэтому он строго закодирован, чтобы разрешить одновременное открытие максимум 1 панели). Мой текущий подход, вероятно, должен будет заключаться в том, чтобы отметить, какие из них открыты, закрыть их все, обновить, а затем снова открыть те, которые были открыты ранее. Много анимации, но не знаю, как еще заставить ее работать в настоящее время. - person jinglesthula; 19.08.2016

Вы можете написать несколько аккордеонов, которые расположены друг над другом, и каждый аккордеон будет иметь только одну панель. Таким образом, панели можно было переключать по отдельности.

person anssi    schedule 21.05.2014

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

$('.my-heading-class').on('click', function() {
   $(this).next('.my-content-class').slideToggle();
});

<div class="my-heading-class">My Heading</div>
<div class="my-content-class">My Content</div>
person isherwood    schedule 29.03.2013
comment
Аккордеон пользовательского интерфейса jQuery — это не просто переключатель слайдов, он обрабатывает множество вещей в доступности, сочетаниях клавиш, фокусе и т. д. - person Tarun; 05.09.2013
comment
Истинный. Я не упомянул jQuery UI Accordion. Я упомянул функциональность аккордеона в общем смысле, что кажется подходящим для вопроса выше. - person isherwood; 05.09.2013