首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我的for循环会改变toggleClass在jQuery中的行为

为什么我的for循环会改变toggleClass在jQuery中的行为
EN

Stack Overflow用户
提问于 2016-08-17 20:26:51
回答 3查看 96关注 0票数 1

我为我的网站模板创建了一个文档,并试图创建一个下拉菜单。这个想法很简单:当我点击链接名称旁边的插入符号时,它的子菜单应该打开,如果我再次点击,它应该关闭。此外,如果任何其他子菜单是打开的,我希望他们关闭,以便一次只打开一个子菜单。

我的解决方案:我使用了toggleClass和for循环。

我的问题是:在我添加了两个for循环之后,每次只打开一个子菜单,就停止工作了。这意味着当我点击一个插入符号时,它会打开子菜单,但是再次单击插入符号,它不会关闭子菜单,它仍然处于打开状态。

以下是代码:

代码语言:javascript
复制
jQuery(document).ready(function(){

  $(".indicator").on("click", showLinks);

    function showLinks(){

      var allMenus = $("#ab-menu, #str-menu, #ht-menu");
      var allCarets = $("#ab-caret, #str-caret, #ht-caret");

      for(i = 0; i < allMenus.length; i++){
        $(allMenus).eq(i).removeClass("show");
      }
      for(i = 0; i < allCarets.length; i++){
        $(allCarets).eq(i).removeClass("caret-rotate");
      }

      var linkId = $(this).attr("data-menu");
      var caretId = $(this).attr("data-caret");

      $(linkId).toggleClass("show");
      $(caretId).toggleClass("caret-rotate");

    };

});
代码语言:javascript
复制
#ab-menu,
#str-menu,
#ht-menu {
  background-color: #1d3557;
  max-height: 0;
  margin: 0.2em 0;
  opacity: 0.5;
  overflow: hidden;
  transition: 0.4s ease-in-out;
}
#ab-menu.show,
#str-menu.show,
#ht-menu.show {
  max-height: 500px;
  opacity: 1;
}
.fa .fa-caret-down {
  display: block;
  color: #fff;
}
.caret-rotate {
  transition: 0.4s ease-in-out;
}
.fa-caret-down.caret-rotate {
  color: #a8dadc;
  transform: rotate(-90deg);
}
代码语言:javascript
复制
<nav>
    <ul class="nav-links">
      <li class="about-panel">About <span class="fa fa-caret-down indicator" id="ab-caret" data-menu="#ab-menu" data-caret="#ab-caret"></span>
        <ul class="sub-menu about-sub-menu" id="ab-menu">
          <li class="about-links"><a href="#about">Main Features</a></li>
          <li class="about-links"><a href="#getting-started">Getting Started</a></li>
        </ul>
      </li>
    </ul>
    <ul class="nav-links">
      <li class="structure-panel">Structure <span class="fa fa-caret-down indicator" id="str-caret" data-menu="#str-menu" data-caret="#str-caret"></span>
        <ul class="sub-menu structure-sub-menu" id="str-menu">
          <li class="structure-links"><a href="#sections">Sections</a></li>
          <li class="structure-links"><a href="#grid">Bootstrap-grid</a></li>
          <li class="structure-links"><a href="#carousel">Bootstrap Carousel</a></li>
        </ul>
      </li>
    </ul>
    <ul class="nav-links">
      <li class="how-to-panel">How-to <span class="fa fa-caret-down indicator" id="ht-caret" data-menu="#ht-menu" data-caret="#ht-caret"></span>
        <ul class="sub-menu how-sub-menu" id="ht-menu">
          <li class="how-to-links"><a href="#nav">Navigation</a></li>
          <li class="how-to-links"><a href="#images">Images</a></li>
          <li class="how-to-links"><a href="#headers">Headers</a></li>
          <li class="how-to-links"><a href="#icons">Icons</a></li>
          <li class="how-to-links"><a href="#colors">Colors</a></li>
          <li class="how-to-links"><a href="#fonts">Fonts</a></li>
          <li class="how-to-links"><a href="#buttons">Buttons</a></li>
          <li class="how-to-links"><a href="#portfolio">Portfolio</a></li>
          <li class="how-to-links"><a href="#map">Map</a></li>
        </ul>
      </li>
    </ul>
    <ul class="nav-links">
      <li class="credits"><a href="#credits">Credits</a></li>
    </ul>
  </nav>

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-08-17 21:42:30

您的代码已接近;@Goose的编辑可以工作,但您还需要其他toggleClass()代码。这是为我工作的:

代码语言:javascript
复制
function showLinks(){
    var allMenus = $("#ab-menu, #str-menu, #ht-menu"),
        allCarets = $("#ab-caret, #str-caret, #ht-caret"),
        linkId = $(this).attr("data-menu"),
        caretId = $(this).attr("data-caret");

    $(allMenus).not($(linkId)).removeClass("show");
    $(allCarets).not($(linkId)).removeClass("caret-rotate");

    $(linkId).toggleClass("show");
    $(caretId).toggleClass("caret-rotate");
};
票数 1
EN

Stack Overflow用户

发布于 2016-08-17 20:31:20

不需要循环。您可以像这样简化代码,我想这将解决您的问题。

代码语言:javascript
复制
var allMenus = $("#ab-menu, #str-menu, #ht-menu");
var allCarets = $("#ab-caret, #str-caret, #ht-caret");

allMenus.removeClass("show");
allCarets.removeClass("caret-rotate");
票数 3
EN

Stack Overflow用户

发布于 2016-08-17 21:16:46

如果不使用jsfiddle /抓取所有依赖项(从外观上看,jQuery和字体非常棒),很难获得一个准确的测试环境,但从DOM的角度来看,我认为您可能可以将单击事件更改为如下所示:

代码语言:javascript
复制
$(document).ready(function() { 
    //Create onclick events for all elements with a class of indicator
    $(".indicator").on("click", function() { 
        //Making jQuery object out of this so we can use jQuery methods
        $this = $(this);
        //Add the caret-rotate class to this
        $this.addClass('caret-rotate');

        //Use the data attribute you made to pass the ID and add a class of show
        $( $this.data("menu") ).addClass("show");

        //The siblings method is very useful here to clear out the caret-rotate classes of everything except this one
        $this.siblings().removeClass("caret-rotate");
        //Grab the siblings again and filter through their children to find the sub-menu class elements, then remove the show class from them
        $this.siblings().children(".sub-menu").removeClass("show");

        //Alternatively you could try this to compress the two lines above into one by chaining the commands, but I can't test right now. Try commenting the above two lines out and uncommenting this when you are testing:
        //$this.siblings().removeClass("caret-rotate").children(".sub-menu").removeClass("show");
    });
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39005694

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档