使用 jQuery(this).next() 在菜单中显示/隐藏下一个嵌套的 UL

Posted

技术标签:

【中文标题】使用 jQuery(this).next() 在菜单中显示/隐藏下一个嵌套的 UL【英文标题】:Using jQuery(this).next() to show/hide the next nested UL in a menu 【发布时间】:2017-02-06 14:34:02 【问题描述】:

每当单击“部分”时,我希望下一个 UL(子菜单)消失(或重新出现)。我可以让一个简单的 P 标签消失在这棵树之外,但我正在尝试使用 jQuery next();功能。如何使用 jQuery 选择此元素。我以为:

$(".section").click(function() 
   $(this).next('ul').hide();
);

可以,但不行……这是 html

  <div class="menu">
    <ul class="main-menu">
        <li class="section">
            Section 1
            <ul class="sub-menu" style="z-index: 3;">
                <li>
                    Section 1A
                </li>
                <li>
                    Section 1B
                </li>
                <li>
                    Section 1C
                </li>
                <li>
                    Back
                </li>
            </ul>
        </li>
        <li class="section">
            Section 2
            <ul class="sub-menu" style="z-index: 2;">
                <li>
                    Section 2A
                </li>
                <li>
                    Section 2B
                </li>
                <li>
                    Section 2C
                </li>
                <li>
                    Back
                </li>
            </ul>
        </li>
    </ul>
</div>

更新

Find() 工作正常。但现在我想知道如何使用带有文本“Back”的 li 元素来关闭子菜单。我在每个子菜单列表的最后一个 LI 元素中添加了一个类“back”,但 jQuery 似乎无法找到它并应用 CSS。这是我所拥有的:

//this code works
$(".section").click(function() 
   $(this).find('ul').css( "left", "0" );
);

//this code doesn't locate the previous UL (i also tried (".sub-menu").css()
$('.back').click(function() 
   $('.back').prev('ul').css( "left", "485" );
);

//html:

            <li class="section">
            Section 1
            <ul class="sub-menu" style="z-index: 3;">
                <li>
                    <a href="#section1a">Section 1A</a>
                </li>
                <li>
                    <a href="#section1b">Section 1B</a>
                </li>
                <li>
                    <a href="#section1c">Section 1C</a>
                </li>
                <li class="back">
                    <a href="#back">Back</a>
                </li>
            </ul>
        </li>

【问题讨论】:

试试$(this).find('ul').hide(); 也可以尝试使用.toggle 来隐藏和显示而不是.hide 尝试@KartikeyaKhosla 的回答你的不工作的原因是在 .next() 函数中你选择当前选定元素的下一个兄弟。在您的情况下,您选择第一个 &lt;li&gt;,这将在调用 next() 时为您提供第二个 &lt;li&gt;。 find() 反而还挖掘子元素并寻找给定的选择器。此外,toggle() 非常适合隐藏和显示,如果您想在同一次点击中实现这两者。 【参考方案1】:

next 影响标签的兄弟姐妹,即其他 .section 标签,而您要操作的 &lt;li&gt; 标签实际上是它的后代。因此你应该使用

$(".section").click(function() 
    $(this).find('ul').toggle();
);

findtoggle 方法是您需要的。

【讨论】:

【参考方案2】:

在您的代码中,您使用next() 来查看下一个兄弟姐妹,而您想查看的是孩子们。要定位它们,您可以使用find(filter) 函数。通过找到ul,您可以使用toggle()slideToggle 来切换它的可见性。

我还为孩子添加了额外的点击功能。这可以防止单击子菜单关闭子菜单。

$(function() 
  $('.section').click( function() 
    $(this).find('ul').slideToggle();
  ).children().click( function() 
    return false;
  );
);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="menu">
  <ul class="main-menu">
    <li class="section">
      Section 1
      <ul class="sub-menu" style="z-index: 3;">
        <li>Section 1A</li>
        <li>Section 1B</li>
        <li>Section 1C</li>
        <li>Back</li>
      </ul>
    </li>
    <li class="section">
      Section 2
      <ul class="sub-menu" style="z-index: 2;">
        <li>Section 2A</li>
        <li>Section 2B</li>
        <li>Section 2C</li>
        <li>Back</li>
      </ul>
    </li>
  </ul>
</div>

【讨论】:

谢谢大家,toggle() 或 slideToggle 绝对是要走的路,我只是使用了 hide(),因为我想快速隐藏元素以知道它正在工作。 Ted,如果我想让“back”孩子工作,而不是其他三个元素,有没有办法做到这一点? 猜后面应该关闭子菜单:$('.sub-menu li:last').click(function() $(this).parent().slideUp(); );

以上是关于使用 jQuery(this).next() 在菜单中显示/隐藏下一个嵌套的 UL的主要内容,如果未能解决你的问题,请参考以下文章

jQuery next() 不能与 live() 一起使用

简单的 jquery $(this).next() 在 IE 中没有表现

为啥我的带有“$(this).next”的 JavaScript/jQuery 脚本不起作用?

Jquery .next(输入或文本区域)

Jquery 不使用 next() 方法遍历

$(this).next().is(':visible') 刚接触jquery者句代码是啥意思啊,看了api半天没搞懂,请指点,谢谢!