Отключить кликабельность на базовом аккордеоне

У меня есть базовый аккордеон, что-то вроде этого. введите здесь описание изображения

<ul class="accordion" data-accordion>
  <li class="accordion-navigation">
    <a href="#panel1a">Accordion 1</a>
    <div id="panel1a" class="content active">
      Panel 1. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
    </div>
  </li>
  <li class="accordion-navigation">
    <a href="#panel2a">Accordion 2</a>
    <div id="panel2a" class="content">
      Panel 2. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
    </div>
  </li>
  <li class="accordion-navigation">
    <a href="#panel3a">Accordion 3</a>
    <div id="panel3a" class="content">
      Panel 3. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
    </div>
  </li>
</ul>

У меня есть пара форм в аккордеоне1 и аккордеоне2. После того, как формы заполнены и проверены. Я перехожу к шагу 3. На этом этапе я хочу отключить кликабельность на аккордеоне1 и аккордеоне2. Они больше не должны расширяться.

Теперь я попытался удалить пару классов и удалить их идентификаторы. Но это не работает. Есть ли способ, которым я могу отключить их от расширения. Документ аккордеона не определяет, как этого добиться.

Чтобы расширить и сжать аккорионы по нажатию кнопки, я делаю что-то вроде этого:

var parent = document.getElementById('collapse3').parentElement;
var parentFoo = new Foundation.Accordion($(parent));
var previousFoo = new Foundation.Accordion($(parent.previousSibling));
parentFoo.down($('#'+parent.children[1].id));
previousFoo.up($('#'+parent.previousSibling.children[1].id));

Теперь есть ли способ отключить аккордеон одним нажатием кнопки. Я попытался удалить соответствующий элемент <a> из дома, но это удалило весь аккордеон.


person nitte93user3232918    schedule 24.07.2016    source источник
comment
Что у вас сейчас есть в качестве javascript? Трудно устранять неполадки только на основе HTML.   -  person Toby    schedule 24.07.2016
comment
Допустим, у меня есть кнопка в моем аккордеоне3, при нажатии этой кнопки я вызываю функцию, которая отключает первые два аккордеона, аккордеон1 и аккордеон2.   -  person nitte93user3232918    schedule 24.07.2016
comment
Я имел в виду добавить свой соответствующий JS к вашему вопросу - у вас будет гораздо больше шансов получить ответы, если вы продемонстрируете свои попытки и покажете, какой код сработал, а какой нет.   -  person Toby    schedule 24.07.2016
comment
@QuỳnhNguyễn, где твой источник, чувак? Я не вижу ваш пост, как я могу проголосовать против?   -  person nitte93user3232918    schedule 24.07.2016


Ответы (2)


Рабочая скрипта

Вам нужно просто добавить класс для определения шагов, которые вы хотите отключить, в моем примере я добавлю класс disabled:

$(document).foundation('accordion');

$('body').on('click', '#disable-steps', function(){
  $('.step-1,.step-2').addClass('disabled');
})

$('.accordion').on('toggled', function (event, accordion) {
  if(accordion.parents('li').hasClass('disabled'))
    accordion.removeClass('active');
});

Hope this helps.

$(document).foundation('accordion');

$('body').on('click', '#disable-steps', function(){
  $('.step-1,.step-2').addClass('disabled');
})

$('.accordion').on('toggled', function (event, accordion) {
  if(accordion.parents('li').hasClass('disabled'))
    accordion.removeClass('active');
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/foundation/5.5.3/js/foundation.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/foundation/5.5.3/js/foundation/foundation.accordion.min.js"></script>

<link href="https://cdnjs.cloudflare.com/ajax/libs/foundation/5.5.3/css/foundation.min.css" rel="stylesheet"/>

<ul class="accordion" data-accordion="myAccordionGroup">
  <li class="accordion-navigation step-1">
    <a href="#panel1c">Step 1</a>
    <div id="panel1c" class="content">
      Panel 1. Lorem ipsum dolor
    </div>
  </li>
  <li class="accordion-navigation step-2">
    <a href="#panel2c">Step 2</a>
    <div id="panel2c" class="content">
      Panel 2. Lorem ipsum dolor
    </div>
  </li>
  <li class="accordion-navigation step-3">
    <a href="#panel3c">Step 3</a>
    <div id="panel3c" class="content">
      Panel 3. 
      <br>
      <button type='button' id='disable-steps'>Disable steps 1 & 2</button> 
    </div>
  </li>
</ul>

person Zakaria Acharki    schedule 24.07.2016
comment
Спасибо за ответ, мне понравился ваш подход. Ваш ответ не совсем то, что мне нужно, я думал, что есть более общий подход, я хочу, чтобы это отключающее действие было во многих местах, например, только когда форма в 1-м аккордеоне действительна, сделайте два других расширяемыми, иначе отключите. Нажатие на первые два не должно сжимать мой уже открытый 3-й аккордеон.. Но мне понравился ваш подход, ваш подход натолкнул меня на мысль обойти в моей ситуации. Я думаю, что я могу использовать его, чтобы решить мою проблему. Еще раз спасибо за ответ. - person nitte93user3232918; 24.07.2016
comment
Привет @Zakaria Acharki. Можете ли вы сказать мне, как поместить этот переключаемый прослушиватель аккордеона в мой компонент реакции? - person nitte93user3232918; 24.07.2016
comment
Я делаю $('.accordion').addEventListener('toggled', function(event, accordion){ console.log('hi'); });, но это не работает. Кроме того, как мне добавить отключенный класс к моим компонентам при монтировании компонента. - person nitte93user3232918; 24.07.2016
comment
Привет, чувак, извини, но я не разработчик реагирования (к сожалению).. ты мог бы опубликовать новый вопрос с тегом реагировать для этой конкретной потребности.. - person Zakaria Acharki; 25.07.2016

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

Я использую это решение в сочетании с AngularJS, который требует, чтобы отключенная проверка выполнялась при каждом взаимодействии с пользователем, а не при инициализации.

Первым шагом является добавление класса css «disabled» к элементам li.accordion, которые необходимо отключить.

<ul class="accordion" data-accordion="true" role="tablist">
    <li class="accordion-item disabled">
        <!-- The tab title needs role="tab", an href, a unique ID, and aria-controls. -->
        <a href="#panel7d" role="tab" class="accordion-title" id="panel7d-heading" aria-controls="panel7d">Panel title</a>
        <!-- The content pane needs an ID that matches the above href, role="tabpanel", data-tab-content, and aria-labelledby. -->
        <div id="panel7d" class="accordion-content" role="tabpanel" data-tab-content="true" aria-labelledby="panel7d-heading">
            <!-- tab content -->
        </div>
    </li>
</ul>

Тогда достаточно простой модификации библиотеки Foundation.js, чтобы отключить элемент карусели.

_createClass(Accordion, [
    // Other functions
    {
        key : 'down',
        value : function down($target, firstTime) {
            var _this2 = this;

            // ADD THIS CHECK TO BE ABLE TO DISABLE THE ACCORDION ITEM
            // Check if the parent accordion-item is disabled. If so, return from this function.
            if ($target.parent().hasClass('disabled')) {
                return;
            }

            // The rest of the function body
        }
    }
    // Other functions
])

Отказ от ответственности: в моей настройке пользователь не может переключать аккордеон «вверх» или управлять аккордеоном с помощью клавиш. Если ваше решение это делает, вам может потребоваться добавить эту проверку и в некоторые другие разделы базовой библиотеки.

person Arnoud Sietsema    schedule 26.08.2016