【问题标题】:jQuery: Close What's Open, Open What's ClosedjQuery:关闭打开的,打开关闭的
【发布时间】:2011-07-09 17:59:00
【问题描述】:

我正在开发一个类似手风琴的简单垂直菜单:

http://www.cybart.com/bscg/

点击我们的解决方案、产品覆盖范围、我们的团队或联系我们打开或关闭子菜单。

但是,如果您连续单击两个或多个这些链接,所有子菜单都会打开。

我希望第一次单击任何菜单项以打开其子菜单并关闭当前打开的子菜单。第二次点击应该只是关闭被点击链接的子菜单。

我将不胜感激您的专业建议。

【问题讨论】:

  • 作为旁注,我建议稍微改变一下菜单的外观(也许缩进打开的部分)。打开一个后,有点难以分辨什么是新链接以及什么会折叠菜单。
  • 哈哈,我只是在你打字的时候这样做。谢谢!

标签: jquery animation slidetoggle slidedown slideup


【解决方案1】:

查看 jQuery :visible 选择器。在 click 事件中,向上滑动已经可见的那个,然后向下滑动要打开的那个。

编辑:这是我过去用来执行此操作的代码 sn-p。请注意,我使用的是定义列表(dl、dt、dd)而不是无序列表(ul 和 li),但您可以调整代码:

$("dt span").click(function () {
   var dd = $(this).parent().next();
    if (dd.is(":visible")) {
        dd.slideUp("slow");
    } else {
        $("dd:visible").slideUp("slow");
        dd.slideDown("slow");
    }
});

希望这会有所帮助!

编辑:OP 要求的实际代码:

<html>
  <head>
    <title>Accordion</title>
    <script src="http://code.jquery.com/jquery-1.6.2.min.js"></script>
  </head>
  <body>
    <ul id="access">
      <!-- Use spans so that only clicks on the item name are processed -->
      <li><span class="item">Item 1</span>
        <ul>
          <li>Item 1 - A</li>
          <li>Item 1 - B</li>
          <li>Item 1 - C</li>
        </ul>
     </li>
      <li><span class="item">Item 2</span>
        <ul>
          <li>Item 2 - A</li>
          <li>Item 2 - B</li>
          <li>Item 2 - C</li>
        </ul>
     </li>
      <li><span class="item">Item 3</span>
        <ul>
          <li>Item 3 - A</li>
          <li>Item 3 - B</li>
          <li>Item 3 - C</li>
        </ul>
     </li>
    </ul>
    <script>
        $(document).ready(function () {

        // All sections rolled up to start
        $("ul#access ul").hide();

        // Open or close as necessary
        $("span.item").click(function () {
            var ul = $(this).next();
            if (ul.is(":visible")) {
                ul.slideUp("slow");
            } else {
                $("ul#access ul:visible").slideUp("slow");
                ul.slideDown("slow");
            }
        });
    });
    </script>
  </body>
</html>

解释:我使用了跨度,以便只有每个项目的文本触发手风琴行为。单击跨度时,我们说 $(this).next() 以到达内部 ul。如果不使用 span 并且将点击处理程序附加到外 li,则在子菜单内单击将触发关闭外 li。

【讨论】:

  • 谢谢雷。我不知道如何调整你的代码,所以我想出了 min,使用 :visible 选择器,正如你所建议的。它几乎可以工作,但是由于某种原因,当我单击 ul ul(子菜单)中的链接时,它的反应方式与我单击更高级别的链接 (ul) 的方式相同。它关闭子菜单。我想保持开放。你能看看吗?我将我的 sn-p 发布在我的问题正文中。
  • 我修改了我的答案以提供一个完整的 HTML 页面,该页面在您的站点中使用 ul 和 li,ID 为“#access”。我认为这个应该更容易适应。
  • 谢谢你一直陪着我,雷。我尝试了修改后的代码。由于某种原因,当我在浏览器中打开 HTML 页面时,它无法正常工作。当我尝试在我的网站中使用您的代码时,它也不起作用。在我将 ('ul#access>li') 替换为 ('#access ul li') 之后,唯一发生的事情是单击链接会向上滑动(隐藏)已单击的链接。你能看看我在问题正文中的代码吗?也许您可以建议我如何更正确地选择列表中的元素?
  • 更正:HTML 页面正常工作(在复制/粘贴阶段发生了一些事情,我不得不稍微清理一下引号),但是代码有点太长了,并且与我在问题正文中发布的更短的 sn-p:单击子菜单链接会关闭子菜单。我希望它保持开放。你能看看我的代码吗?也许你可以建议如何只选择更高级别的 ul?
  • 哦,现在我明白了。当然,迪米特里。为了确保只处理子菜单的文本,恐怕您将不得不使用跨度并将处理程序附加到它。我已经编辑了我的答案。希望你能得到它!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-06
  • 2010-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多