【问题标题】:Add Class to one dropdown Remove Class From others将类添加到一个下拉列表从其他人中删除类
【发布时间】:2015-10-28 04:20:43
【问题描述】:

我有一个包含 3 个下拉菜单的叠加菜单。

当您单击其中一个具有下拉菜单的父项时,会向子项添加一个类以“激活”下拉菜单并展开并显示。目前它工作正常,单击时,如果再次单击,则会添加和删除该类。

目前的问题是您可以同时打开所有下拉菜单。我需要做的是一次只能有一个下拉菜单处于活动状态。

如果一个下拉菜单处于活动状态,并且用户点击另一个,则原来的活动下拉菜单将关闭,而新点击的下拉菜单将变为活动状态。

此外,如果下拉菜单处于活动状态并且用户再次单击同一父项,则下拉菜单将关闭。

当前 HTML

我已排除所有其他列表项,但有下拉列表的项除外。

<ul class="header__overlay-nav">

              <li class="js-overlay-dropdown-trigger">
                <a class="header__overlay-nav-links" href="#">
                  After Action Review
                  <i class="fa fa-angle-down btn__icon-right"></i>
                </a>

                <ul class="dropdown--overlay">

                  <li class="dropdown__item">
                    <a class="dropdown__links" href="#">
                      Overview
                    </a>
                  </li>
                  <li class="dropdown__item">
                    <a class="dropdown__links" href="#">
                      Review Form
                    </a>
                  </li>
                  <li class="dropdown__item">
                    <a class="dropdown__links" href="#">
                      Performance Card
                    </a>
                  </li>
                  <li class="dropdown__item">
                    <a class="dropdown__links" href="#">
                      Recent Recordings
                    </a>
                  </li>
                </ul>
              </li>



              <li class="js-overlay-dropdown-trigger">
                <a class="header__overlay-nav-links" href="#">
                  Downloads
                  <i class="fa fa-angle-down btn__icon-right"></i>
                </a>
                <ul class="dropdown--overlay">    
                  <li class="dropdown__item">
                    <a class="dropdown__links" href="#">
                      100 Day Challenge App
                    </a>
                  </li>
                  <li class="dropdown__item">
                    <a class="dropdown__links" href="#">
                      Desktop Wallpapers
                    </a>
                  </li>
                  <li class="dropdown__item">
                    <a class="dropdown__links" href="#">
                      Screen Savers
                    </a>
                  </li>
                  <li class="dropdown__item">
                    <a class="dropdown__links" href="#">
                      Forms
                    </a>
                  </li>
                </ul>
              </li>


              <li class="js-overlay-dropdown-trigger">
                <a class="header__overlay-nav-links" href="#">
                  Inspiration
                  <i class="fa fa-angle-down  btn__icon-right"></i>
                </a>
                <ul class="dropdown--overlay">    
                  <li class="dropdown__item">
                    <a class="dropdown__links" href="#">
                      Get Your Mojo Working
                    </a>
                  </li>
                  <li class="dropdown__item">
                    <a class="dropdown__links href="#">
                      Game Changers
                    </a>
                  </li>
                  <li class="dropdown__item">
                    <a class="dropdown__links" href="#">
                      Bold Actions - Big Rewards
                    </a>
                  </li>
                  <li class="dropdown__item">
                    <a class="dropdown__links" href="#">
                      Motivational Videos
                    </a>
                  </li>
                </ul>
              </li> 
          </ul>

当前的 Jquery

这是我用来对活动类进行基本切换的原始 Jquery,基本上只是在单击触发器的子 UL 上使用 toggleClass。

注释掉了,我之前尝试删除所有活动类,然后不是在我添加的 click 元素上切换类,而是删除所有类,只是将其添加到单击的类中,因此无法通过单击关闭下拉列表再次触发相同的触发器。

var $overlayDdTrigger = $('.js-overlay-dropdown-trigger');

var $overlayClasses = {

    // Active css Class for dropdowns in Main Overlay
    OverlayDdActive: 'dropdown--overlay-is-active',

    ButtonIconIsRotated: 'btn__icon-is-rotated',
  };

  $overlayDdTrigger.on('click', function() {

    if (_isMobile) {
      // Attempt to to remove all active classes on UL's prevents dropdown from 
      // being able to close if the same trigger is clicked twice

      // $('ul.dropdown--overlay-is-active').removeClass($overlayClasses.OverlayDdActive);

      $(this).children('ul').toggleClass($overlayClasses.OverlayDdActive);

      $(this).find('.btn__icon-right').toggleClass($overlayClasses.ButtonIconIsRotated);
    }
  });

提前感谢您的帮助,我知道这里有很多与此问题相关的问题,我进行了大量搜索,但找不到任何可以帮助我解决此特定案例的问题。

【问题讨论】:

  • 在点击处理程序中将此添加为第一行$('.' + $overlayClasses.OverlayDdActive).removeClass($overlayClasses.OverlayDdActive);
  • @Tushar 感谢您的回复,这与我注释掉的代码行本质上不一样吗?它只是删除页面上所有当前活动的类。有了这条线,就不可能通过单击同一个触发器两次来关闭下拉菜单。
  • @VinceBrown 很难分辨 HTML 中嵌套了什么,而且类过于冗长。
  • @zer00ne 所有触发器都有一个类“js-overlay-dropdown-trigger”所有下拉菜单都有一个类“dropdown--overlay”。嵌套的代码格式可能不是最好的,因为它是复制和粘贴的,但是“详细”的类只是一种偏好,对问题根本没有影响。
  • @VinceBrown 巨大的类和 id 名称的问题在于它使所有内容都无法阅读并且容易出现人为错误。有条理、简洁且语义合理的代码非常重要,尤其是当您要与他人共享时。

标签: javascript jquery html


【解决方案1】:

我希望这会起作用,如果它引起任何问题,请发表评论。

<html>
<body>
    <script src="https://code.jquery.com/jquery-1.11.3.min.js"></script>
        <script>
        var $overlayDdTrigger = $('.js-overlay-dropdown-trigger');

        var $overlayClasses = {
            OverlayDdActive: 'dropdown--overlay-is-active',
            ButtonIconIsRotated: 'btn__icon-is-rotated',
          };

        $overlayDdTrigger.on('click', function() {

          if($(this).find('ul').hasClass('dropdown--overlay-is-active')){

            $overlayDdTrigger.find('ul').removeClass($overlayClasses.OverlayDdActive);
            $overlayDdTrigger.find('.btn__icon-right').removeClass($overlayClasses.ButtonIconIsRotated);
          }else{

            $overlayDdTrigger.find('ul').removeClass($overlayClasses.OverlayDdActive);
            $overlayDdTrigger.find('.btn__icon-right').removeClass($overlayClasses.ButtonIconIsRotated);
            $(this).find('ul').addClass($overlayClasses.OverlayDdActive);
            $(this).find('.btn__icon-right').addClass($overlayClasses.ButtonIconIsRotated);
          }
        });
        </script>
            <style>
        .dropdown--overlay{
        display:none;
        }
        .dropdown--overlay-is-active{
        display: block !important;
        }
        </style>
        <ul class="header__overlay-nav">

        <li class="js-overlay-dropdown-trigger">
          <a class="header__overlay-nav-links" href="#">
            After Action Review
            <i class="fa fa-angle-down btn__icon-right"></i>
          </a>

          <ul class="dropdown--overlay">

            <li class="dropdown__item">
              <a class="dropdown__links" href="#">
                Overview
              </a>
            </li>
            <li class="dropdown__item">
              <a class="dropdown__links" href="#">
                Review Form
              </a>
            </li>
            <li class="dropdown__item">
              <a class="dropdown__links" href="#">
                Performance Card
              </a>
            </li>
            <li class="dropdown__item">
              <a class="dropdown__links" href="#">
                Recent Recordings
              </a>
            </li>
          </ul>
        </li>



        <li class="js-overlay-dropdown-trigger">
          <a class="header__overlay-nav-links" href="#">
            Downloads
            <i class="fa fa-angle-down btn__icon-right"></i>
          </a>
          <ul class="dropdown--overlay">    
            <li class="dropdown__item">
              <a class="dropdown__links" href="#">
                100 Day Challenge App
              </a>
            </li>
            <li class="dropdown__item">
              <a class="dropdown__links" href="#">
                Desktop Wallpapers
              </a>
            </li>
            <li class="dropdown__item">
              <a class="dropdown__links" href="#">
                Screen Savers
              </a>
            </li>
            <li class="dropdown__item">
              <a class="dropdown__links" href="#">
                Forms
              </a>
            </li>
          </ul>
        </li>


        <li class="js-overlay-dropdown-trigger">
          <a class="header__overlay-nav-links" href="#">
            Inspiration
            <i class="fa fa-angle-down  btn__icon-right"></i>
          </a>
          <ul class="dropdown--overlay">    
            <li class="dropdown__item">
              <a class="dropdown__links" href="#">
                Get Your Mojo Working
              </a>
            </li>
            <li class="dropdown__item">
              <a class="dropdown__links href="#">
                Game Changers
              </a>
            </li>
            <li class="dropdown__item">
              <a class="dropdown__links" href="#">
                Bold Actions - Big Rewards
              </a>
            </li>
            <li class="dropdown__item">
              <a class="dropdown__links" href="#">
                Motivational Videos
              </a>
            </li>
          </ul>
        </li> 
        </ul>

</body>
</html>

【讨论】:

  • 感谢您的回答,但这个解决方案与我注释掉的问题有相同的问题,它无法通过单击相同的触发器两次来关闭下拉菜单。
  • 哦..我明白了,让我检查一下,我会回到这里。
  • 嗨..请检查编辑的答案我已将 js 设置为通过单击两次相同的触发器来关闭下拉菜单。
  • 感谢您的帮助,我找到了答案(已在上面发布)但非常感谢您花时间制定解决方案。
【解决方案2】:

想出了一个可以按要求工作的解决方案。

$overlayDdTrigger.on('click', function() {

    if (_isMobile) {

      // Toggle Class On clicked Element
      $(this).children('ul').toggleClass($overlayClasses.OverlayDdActive);

      // Remove all Active Dropdowns From all Siblings
      $(this).siblings().children('ul').removeClass($overlayClasses.OverlayDdActive);

      $(this).find('.btn__icon-right').toggleClass($overlayClasses.ButtonIconIsRotated);

    }

  });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-02
    • 1970-01-01
    相关资源
    最近更新 更多