【问题标题】:Multiple accordions simultaneously open. How to open only 1 JQuery accordion at a time多个手风琴同时打开。如何一次只打开 1 个 JQuery 手风琴
【发布时间】:2022-11-19 13:10:14
【问题描述】:

当前打开的手风琴在另一个打开时不会关闭。

这是我用的代码,不知道哪里错了。

<script>
$(document).ready(function () {

//each accordion has a text entry and a corresponding image     
  var accordionEntries = document.querySelectorAll('.accordion-entry');
  var accordionImages = document.querySelectorAll('.accordion-image'); 
  
    for ( var i = 0; i < accordionEntries.length; i++ ) {
    accordionEntries[i].dataset.target = 'accordion-image-' + i;
    accordionImages[i].classList.add('accordion-image-' + i);
  }
  

//toggles accordion open state    
  $(document).on('click', '.accordion-header', function () {
    if ($(this).is(".accordion-open")) return $(this).removeClass("accordion-open");
    var parent = $(this).closest('.accordion-entry, .accordion-image');
    if(!parent.hasClass('.accordion-open')){
        parent.toggleClass('accordion-open');
      } else {
$('.accordion-open').removeClass('accordion-open')
}
    $('.' + parent.data('target')).toggleClass('accordion-open')
    
  })

})
</script>

【问题讨论】:

  • 每次打开手风琴时,您都可以使用 $('.accordion-open').removeClass('accordion-open') 关闭所有打开的手风琴。
  • 您希望一次只打开一个手风琴?如果是这样,您也应该关闭其他打开的手风琴。使用.accordion-header.accordion-open之类的东西来选择所有打开的手风琴并删除accordion-open类。
  • @Geshode 我确实尝试过,但它会阻止当前打开的手风琴关闭。有没有办法可以将代码中的数字“.accordion-open”限制为 1?
  • 如果您更改问题并添加手风琴 HTML,那就太好了。

标签: javascript jquery accordion


【解决方案1】:

感谢大家帮忙解答问题,终于有同事帮我解决了这个问题。这是 cmets 的解决方案,对其他任何人都有好处。

<script>
$(document).ready(function () { 
  var accordionEntries = document.querySelectorAll('.accordion-entry');
  var accordionImages = document.querySelectorAll('.accordion-image');
  
    for ( var i = 0; i < accordionEntries.length; i++ ) {
    accordionEntries[i].dataset.target = 'accordion-image-' + i;
    accordionImages[i].classList.add('accordion-image-' + i);
  }
      
  $(document).on('click', '.accordion-header', function () {
    // close currently opened accordion
    // add class to open clicked accordion  
    var accordionEntry = $(this).closest('.accordion-entry');
    var open = 'accordion-open';
    
    /* If the accordion that was clicked is in open state, 
    *  remove all occurrences of the 'accordion-open' class and DO NOTHING 
    *  AFTER.
    */
    if (accordionEntry.hasClass('accordion-open')) {
            accordionEntry.removeClass(open);
        $('.' + open).removeClass(open);
    } else {
        /* If the accordion that was clicked is NOT in open state, 
        *  remove all occurrences of the 'accordion-open' class and add 'accordion-open' class
        *. to the accordion that was clicked.
        */
        accordionEntry.removeClass(open);
                $('.'+ open).removeClass(open);
        accordionEntry.addClass('accordion-open');
        $('.'+ accordionEntry.data['target']).addClass(open)
          $('.'+ accordionEntry[0].dataset.target).addClass(open)
    } 
    });
}); 
</script>

【讨论】:

  • 您没有很好地利用正在加载的库。我要么使用 jQuery,要么不使用,但要避免这种 jQuery 和本机 JavaScript 的随机混合。
猜你喜欢
  • 1970-01-01
  • 2011-10-20
  • 2021-12-03
  • 1970-01-01
  • 1970-01-01
  • 2018-12-26
  • 2016-10-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多