Bootstrap.js Accordion Collapse/Expand - программирование

Bootstrap.js Accordion Collapse/Expand

Я пытаюсь создать предыдущие/следующие кнопки на каждом аккордеонном теле.

Я не могу найти способ свернуть/развернуть определенный раздел. Я попытался удалить класс in из accordion-body, но это не похоже на сбой.

        $(".accordion-body").each(function(){
            if($(this).hasClass("in")) {
                $(this).removeClass("in");
            }
        });

Кроме того, всякий раз, когда я использую метод .collapse, я получаю ошибку javascript, говорящую, что объект не имеет коллапса метода.

4b9b3361

Ответ 1

Класс in - это просто индикатор того, что раздел открыт. Модуль Javascript применяет те же встроенные стили, что и .in, поэтому удаление класса недостаточно.

Вам необходимо использовать API-интерфейс модуля для программного взаимодействия с аккордеоном с помощью метода .collapse():

$('.accordion-body').each(function(){
    if ($(this).hasClass('in')) {
        $(this).collapse('toggle');
    }
});

Или вы можете сконденсировать это до:

$('.accordion-body.in').collapse('toggle');

Если вы хотите только свернуть любые открытые разделы:

$('.accordion-body').collapse('hide');

Если вы хотите только расширить любые закрытые разделы:

$('.accordion-body').collapse('show');

Ответ 2

Вот еще одно решение:

/**
 * Make an accordion active
 * @param {String} id ID of the accordion
 */
var activateAccordion = function (id) {
    // Get the parents
    var parents = $('a[href="#' + id + '"]').parents('.panel-group').children('.panel');

    // Go through each of the parents
    $.each(parents, function (idx, obj) {
        // Check if the child exists
        var find = $(obj).find('a[href="#' + id + '"]'),
            children = $(obj).children('.panel-collapse');

        if (find.length > 0) {
            // Show the selected child
            children.removeClass('collapse');
            children.addClass('in');
        } else {
            // Hide the others
            children.removeClass('in');
            children.addClass('collapse');
        }
    });
};

Важной частью кода является комбинация, помнящая класс .collapse, а не только .in:

// Show the selected child
children.removeClass('collapse');
children.addClass('in');

и

// Hide the others
children.removeClass('in');
children.addClass('collapse');

Приведенный выше пример был протестирован в Twitter Bootstrap v3.3.4

Ответ 3

Это работает для аккордеонов в Bootstrap 3:

var selector = $('.panel-heading a[data-toggle="collapse"]');
selector.on('click',function() {
  var self = this;
  if ($(this).hasClass('collapsed')) {
    $.each(selector, function(key, value) {
      if (!$(value).hasClass('collapsed') && value != self) {
        $(value).trigger('click');
      }
    });
  }
});

Я имитирую щелчок других вкладок аккордеона с помощью $(value).trigger('click');. В соответствии с API вы должны просто использовать метод .collapse(), т.е. $(value).collapse('hide');. Но по какой-то причине это не работает, поэтому trigger это...

Ответ 4

Для этой проблемы используйте addClass ( "in" ); только из-за использования ".collapse('toggle/Hide/Show'); будет мешать будущей функции переключения.

Ответ 5

Другой связанный случай использования - когда у нас есть формы внутри аккордеонов, и мы хотим расширить аккордеон ошибками валидации. Расширяя ответ Дэниела Райта fooobar.com/questions/193661/..., мы можем сделать что-то вроде

/**
 * Expands accordions that have fields with errors
 *
 */
var _expandAccordions = function () {
    $form           = $('.my-input-form');
    // you can adjust the following lines to match your form structure / error classes
    var $formGroups = $form.find('.form-group.has-error');  
    var $accordions = $formGroups.closest('.accordion-body');

    $accordions.each(function () {
        $(this).collapse('show');
    });
};

Ответ 6

Я сделал,

$('.mb-0').click(function(){
  $('.collapse').collapse('hide');
  $('.collapse.in').collapse('show');
});

и это работает для меня

Ответ 7

Используя Bootstrap 4, добавьте следующие кнопки в корпус карты

<input type="button" class="btn btn-secondary btn-block btn-sm mt-3 text-center card-proceed-next" value="Proceed" />
<input type="button" class="btn btn-secondary btn-block btn-sm mt-3 text-center card-proceed-prev" value="Previous" />

Добавьте следующий javascript (включает в себя показательные панели "Азхар Хаттак" с ошибками проверки):

$(function () {
    $('.card-proceed-next').click(function (e) {
        e.preventDefault();
        $(e.target).closest('.collapse').collapse('hide'); // hide current accordion panel
        $(e.target).closest('.card').next('.card').find('.collapse').addClass('show'); // show next accordion panel
    });

    $('.card-proceed-prev').click(function (e) {
        e.preventDefault();
        $(e.target).closest('.collapse').collapse('hide'); // hide current accordion panel
        $(e.target).closest('.card').prev('.card').find('.collapse').addClass('show'); // show previous accordion panel
    });

    var $elErrors = $('#accordion').find('.field-validation-error'); // elements with error class
    var $accordionsWithErrors = $elErrors.closest('.collapse'); // accordions with error elements 
    if ($accordionsWithErrors.length > 0) $('.collapse').collapse(); // collapse all accordion panels due to the first accordion panel shown as default
    $accordionsWithErrors.each(function () {
        $(this).addClass('show'); // show accordion panels with error messages
    });
});

Ответ 8

с ванильным JavaScript

  const el = document.getElementById('bodyCollapse');
  el.click();

где tagsCollapse - это id исходной триггерной кнопки свертывания. Что-то вроде -

           <a
              data-toggle="collapse"
              href="#accordionBody"
              role="button"
              id="bodyCollapse"
              aria-expanded="false"
              aria-controls="accordionBody"
            >
             accordion header
            </a>

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