javascript - jQuery 的简单子(monad)菜单故障

标签 javascript jquery html css

我的网站上有一个简单的菜单 - 当我单击主链接时,它会打开一个子菜单。但是,如果我单击另一个主链接,它不会关闭原始子菜单。我该如何解决这个问题?

用例子描述可能更容易 - 点击Projects,然后点击More Projects:http://jsfiddle.net/oxg7e07c/

$('#menu-primary-menu>li>a').click(function() {
  $(this).next().toggle();
  // if there is any other element after a the  use
  // $(this).parent().find('ul').toggle();
  // also if you need any better effect then use
  // slideToggle() or fadeToggle instead of toggle()
});
#menu-primary-menu>li>ul {
  display: none
}
#menu-primary-menu {
  background-color: #eee;
  width: 200px;
}
#menu-primary-menu {
  position: relative;
}
#menu-primary-menu ul {
  width: 200px;
  background-color: red;
  position: absolute;
  margin-top: 0;
  top: 0;
  left: 250px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<div class="menu-primary-menu-container">
  <ul id="menu-primary-menu" class="menu">
    <li id="menu-item-27" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children menu-item-27"><a href="#">Projects</a>
      <ul>
        <li id="menu-item-26" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-26"><a href="/category/projects/residential/">Residential</a>
        </li>
        <li id="menu-item-24" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-24"><a href="/category/projects/private/">Private</a>
        </li>
      </ul>
    </li>


    <li id="menu-item-27" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children menu-item-27"><a href="#">More Projects</a>
      <ul>
        <li id="menu-item-26" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-26"><a href="/category/projects/residential/">Residential2</a>
        </li>
        <li id="menu-item-24" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-24"><a href="/category/projects/private/">Private</a>
          <li id="menu-item-24" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-24"><a href="/category/projects/private/">Private</a>
            <li id="menu-item-24" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-24"><a href="/category/projects/private/">Private</a>
            </li>
      </ul>
      </li>

  </ul>
</div>

最佳答案

当打开一个新的子菜单时,其他菜单项应该被隐藏。您可以通过在事件处理程序中添加以下行来使用它。

$(this) // The element that is clicked i.e. a
    .parent() // The direct parent of the clicked element i.e. li
    .siblings() // All the sibling elements
    .find('ul').hide(); // Find will search for the `ul` inside the siblings and hide it

演示:

$('#menu-primary-menu>li>a').click(function() {
  $(this).parent().siblings().find('ul').hide();
  $(this).next().toggle();
});
#menu-primary-menu>li>ul {
  display: none
}
#menu-primary-menu {
  background-color: #eee;
  width: 200px;
}
#menu-primary-menu {
  position: relative;
}
#menu-primary-menu ul {
  width: 200px;
  background-color: red;
  position: absolute;
  margin-top: 0;
  top: 0;
  left: 250px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<div class="menu-primary-menu-container">
  <ul id="menu-primary-menu" class="menu">
    <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children menu-item-27"><a href="#">Projects</a>
      <ul>
        <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-26"><a href="/category/projects/residential/">Residential</a>
        </li>
        <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-24"><a href="/category/projects/private/">Private</a>
        </li>
      </ul>
    </li>
    <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children menu-item-27"><a href="#">More Projects</a>
      <ul>
        <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-26"><a href="/category/projects/residential/">Residential2</a>
        </li>
        <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-24"><a href="/category/projects/private/">Private</a>
        </li>
        <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-24"><a href="/category/projects/private/">Private</a>
        </li>
        <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-24"><a href="/category/projects/private/">Private</a>
        </li>
      </ul>
    </li>
  </ul>
</div>


  • idDOM 中应该是唯一。如果您希望多个元素具有相同的行为,请使用类而不是 id(您已经拥有)。我已经从上面的演示/代码段中删除了重复的 ID。

  • 第二个子菜单中的 li 元素缺少结束标记。

  • 我还建议您使用 slideUp/slideDown/slideTogglefadeIn/fadeOut/fadeToggle 来实现更流畅的动画/过渡。

    <

动画演示: Slide Effect Fade Effect

更进一步,您还可以将这两个语句链接起来

// http://jsfiddle.net/tusharj/neaec98t/3/
$(this) // Clicked anchor element
    .next() // Immediate next sibling
        .toggle() // Toggle the visibility
    .end() // Go back to the previous context, the context is changed when used `next()`
    .parent()
    .siblings()
        .find('ul')
        .hide();

关于javascript - jQuery 的简单子(monad)菜单故障,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32930577/

相关文章:

javascript - Vue SPA 中的视频无法在 iPhone 上自动播放/加载

javascript - 如何克隆 Javascript 对象数组?

javascript - 在 onClick (HTML) 中打断线

javascript - 使用 jQuery 的 slideDown 显示 : inline-block

html - 阿拉伯字符和拉丁字符混淆

html - webkit 渐变和不透明度

javascript - 根据刻度值更改 D3 刻度线的大小

javascript - 导入后设置更漂亮的空行?

javascript - 函数中的全局变量值不更新

javascript - jquery 数据表页面上未显示列选择器