jquery ui аккордеон - несколько аккордеонов развернуть / свернуть все - проблемы со стилем

Я пытаюсь создать аккордеон, в котором я могу развернуть/свернуть все разделы одним щелчком мыши. Мне также нужна возможность для пользователя открывать и закрывать разделы, в которых одновременно открыто 0-n разделов. Используя несколько обсуждений здесь, в stackoverflow и на форумах jquery, вот решение, которое я придумал: я реализовал каждый раздел как собственный аккордеон, где для каждого установлено значение складной = true.

<html>
    <head>
        <title>Accordion Test</title>

        <script type="text/javascript" src="../scripts/jquery-1.4.2.min.js"></script>
        <script type="text/javascript" src="../scripts/jquery-ui-1.8.4.custom.min.js"></script>

        <link rel="stylesheet" href="../_templates/css/jquery-ui-1.8.6.custom.css"  type="text/css" />
        <link rel="stylesheet" href="../_templates/css/jquery.ui.accordion.css" type="text/css" />
    </head>

<body>
        <a onClick="expandAll()">Expand All</a>
        <br>
        <a onClick="collapseAll()">Collapse All</a>
            <div id="accordion1" class="accord">
            <h5><a href="#">section 1</a></h5>
            <div>
                    section 1 text  
            </div>
            </div>

            <!-- orders section -->
            <div id="accordion2" class="accord">
            <h5><a href="#">section 2</a></h5>
            <div>
                    section 2 text  
            </div>
            </div>

            <!--  section 3 -->
            <div id="accordion3" class="accord">
            <h5><a href="#">section 3</a></h5>
            <div>
                    section 3 text  
            </div>
            </div>

            <!-- section 4 -->
            <div id="accordion4">
            <h5><a href="#">section 4</a></h5>
            <div>
                    section 4 text                  
            </div>
            </div>


</body>
</html>


<script type="text/javascript">

$(function() {
    $('#accordion1').accordion({
        header: 'h5',
        collapsible: true,
        autoHeight: false
    });
});
$(function() {
    $('#accordion2').accordion({
        header: 'h5',
        collapsible: true,
        autoHeight: false,
        active: false
    });
});
$(function() {
    $('#accordion3').accordion({
        header: 'h5',
        collapsible: true,
        autoHeight: false,
        active: false
    });
});
$(function() {
    $('#accordion4').accordion({
        header: 'h5',
        collapsible: true,
        autoHeight: false,
        active: false
    });
});

</script>

<script type="text/javascript">
$(document).ready(function() {

})

function expandAll() {
    alert("calling expandAll");
    $("#accordion1, #accordion2, #accordion3, #accordion4")
        .filter(":not(:has(.ui-state-active))")
        .accordion("activate", 0);
}

function collapseAll() {
    alert("calling collapseAll");
    $("#accordion1, #accordion2, #accordion3, #accordion4")
        .filter(":has(.ui-state-active)")
        .accordion("activate", -1);
}

</script>

Проблема, с которой я сталкиваюсь, заключается в том, что когда я щелкаю заголовок открытого раздела, раздел сворачивается, как и ожидалось, но заголовок по-прежнему имеет класс «ui-state-focus», пока я не щелкну в другом месте на странице. Итак, что я вижу в пользовательском интерфейсе, так это то, что заголовок только что закрытого раздела имеет тот же цвет фона, что и мой эффект наведения, пока я не щелкну в другом месте, и он не изменится на цвет «по умолчанию, не сфокусированный».

Кроме того, когда я использую ссылку «Свернуть все», все отлично выглядит в Firefox. В IE последний заголовок раздела имеет такую ​​же окраску при наведении курсора.

Какие-либо предложения? Мне как-то нужно заставить аккордеон терять фокус, когда он закрыт? Как бы я это сделал?


person tia    schedule 01.02.2011    source источник
comment
Это не решение для одного аккордеона. В примере используется несколько аккордеонов.   -  person jmav    schedule 12.04.2011


Ответы (4)


После попытки переопределить мои стили jquery-ui на странице и попытки взломать javascript-аккордеон, чтобы удалить класс ui-state-focus, появилось простое решение.

Поскольку моя страница отображает ожидаемое поведение, когда я щелкаю в другом месте страницы, я использовал blur(), чтобы потерять фокус.

$(document).ready(function() {
    // forces lose focus when accordion section closed. IE and FF.
    $(".ui-accordion-header").click(function(){
          $(this).blur();
        });

})

Чтобы исправить проблему со свертыванием всех в IE, я добавил 1 строку в свой метод collapAll().

function collapseAll() {
    alert("calling collapseAll");
    $("#accordion1, #accordion2, #accordion3, #accordion4")
        .filter(":has(.ui-state-active)")
        .accordion("activate", -1);
    $(".ui-accordion-header").blur();
}
person tia    schedule 09.02.2011

Решение для реализации аккордеона со всеми открытыми панелями. Панели статичны и не могут быть закрыты.

Не инициализируйте div аккордеона виджетом аккордеона!

$("#accordion").addClass("ui-accordion ui-widget ui-helper-reset")
  .find('h3')
  .addClass("current ui-accordion-header ui-helper-reset ui-state-active ui-corner-top")
  .prepend('<span class="ui-icon ui-icon-triangle-1-s"/>')
  .next().addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content-active");
person jmav    schedule 12.04.2011

это мой ответ ~ надеюсь, что это поможет

для многократного открытия вы можете сделать это, используя существующий пользовательский интерфейс jquery, просто добавьте параметры перед активацией:

мой код ниже:

$( "#accordion" ).accordion({
        header: "> div > h3",
        autoHeight: false,
        collapsible: true,
        active: false,
        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('fast'); }  else { currContent.slideDown('fast'); }

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

обратитесь к: аккордеон пользовательского интерфейса jQuery, который поддерживает несколько открытых разделов?

и функция схлопывается и расширяется

function accordion_expand_all()
{
  var sections = $('#accordion').find("h3");
  sections.each(function(index, section){
    if ($(section).hasClass('ui-state-default') && !$(section).hasClass('accordion-header-active')) {
      $(section).click();
    }
  });

}

function accordion_collapse_all()
{
  var sections = $('#accordion').find("h3");
  sections.each(function(index, section){
    if ($(section).hasClass('ui-state-active')) {
      $(section).click();
    }
  });
}

Это оно..

person Edwin Wong    schedule 07.08.2013
comment
Очень красивое решение! Нравится! Молодец! - person Oleg Klimenko; 19.11.2016

Вы можете попробовать этот небольшой и легкий плагин.

У него будет несколько доступных опций, которые мы можем изменить в соответствии с нашими требованиями.

URL: http://accordion-cd.blogspot.com/

person Dharam Mali    schedule 14.05.2014