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
@Andrei Също така вярвам, че няма начин, предоставен от jQuery, но търся дали е възможно да го разширя. Тъй като в моето приложение jQuery UI вече е внедрен за други неща и за достъпност на джаджи. Така че не искам да пиша код от нулата или да използвам друга библиотека.   -  person Tarun    schedule 29.03.2013
comment
вижте това jsfiddle.net/AR57Y   -  person rajesh kakawat    schedule 29.03.2013
comment
@Rajesh В този случай няма да работи в JAWS и други екранни четци с клавишни комбинации, единствената причина е да използвате jQuery UI е достъпността.   -  person Tarun    schedule 01.04.2013
comment
Подобрих jsfiddle.net/AR57Y, за да не превъртате до горната част на страницата, ако щракнете върху заглавката, но не върху иконата на триъгълник: jsfiddle.net/HotFusionMan/y3vN5/1   -  person Al Chou    schedule 12.06.2013
comment
възможен дубликат на jQuery UI акордеон, който държи множество секции отворени?   -  person Simon East    schedule 03.06.2015


Отговори (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 хей, опитах се да внедря това на моята страница и сега всичките ми елементи div със съдържание винаги имат една и съща височина. Не мога да разбера какво става. 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 UI 1.9.2 (издаден през 2012 г.), който се използва в примерната цигулка. Въпреки че все още работи в поне 1.10.4, по-новите версии на jQuery UI ще оставят отворени панели в полусъстояние, когато извикате метода за опресняване на акордеона. (Вътрешно приспособлението използва индекс за активния панел, така че е строго кодирано, за да позволи максимално отваряне на 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 UI accordion не е просто превключване на слайдове, те се справят с много неща в достъпността, клавишните комбинации, фокуса и т.н. - person Tarun; 05.09.2013
comment
Вярно. Не споменах jQuery UI Accordion. Споменах функционалността на акордеона в общ смисъл, което изглеждаше подходящо за въпроса по-горе. - person isherwood; 05.09.2013