【问题标题】:jQuery drop down menu .slideUp() not workingjQuery下拉菜单.slideUp()不起作用
【发布时间】:2014-02-28 16:16:00
【问题描述】:

我有两个带有 jQ​​uery 下拉菜单的 div。当我单击文档上的任意位置时,一个活动菜单会向上滑动,但是当我使用 jQuery 下拉菜单单击另一个 div 时,之前打开的菜单仍保持打开状态。

HTML(示例)

<div id="menu-act" class="menu-button">
<ul class="no-js">
    <li>
    <a id="btnclick" class="actions">Actions</a>
    <ul class="action-options">
        <li>item1</li>
        <li>item2</li>
        <li>item3</li>
        <li>item4</li>
        </ul>
    </li>
</ul>
</div>
<div id="menu-act2" class="menu-button">
<ul class="no-js">
    <li>
    <a id="btnclick2" class="actions">Actions</a>
    <ul class="action-options">
        <li>item1</li>
        <li>item2</li>
        <li>item3</li>
        <li>item4</li>
        </ul>
    </li>
</ul>
</div>

JQuery(示例)

$(function() {
        $("#menu-act > ul").toggleClass("no-js js");
        $("#menu-act .js ul").hide();
        $("#menu-act .js").click(function(e) {
            $("#menu-act .js ul").slideToggle(100);
            $("#btnclick").toggleClass("active");
            e.stopPropagation();
        });
    $("#menu-act2 > ul").toggleClass("no-js js");
        $("#menu-act2 .js ul").hide();
        $("#menu-act2 .js").click(function(e) {
            $("#menu-act2 .js ul").slideToggle(100);
            $("#btnclick2").toggleClass("active");
            e.stopPropagation();
        });
        $(document).click(function() {
        if ($('.menu-button .js ul').is(':visible')) {
            $('.menu-button .js ul', this).slideUp(10);
            $('.actions').removeClass('active');
        }
    });

});

演示:http://jsfiddle.net/56ycx/1/

当我点击另一个下拉菜单时,如何隐藏以前打开的菜单?

【问题讨论】:

  • 你能发布相关的HTML,并在JSfiddle中创建一个演示吗?

标签: jquery drop-down-menu


【解决方案1】:

DEMO

我觉得很简单

试试这个

$(function () {
    $(".menu-button .action-options").hide();
    $(".menu-button ul a").click(function (e) {
      $(".menu-button .action-options").hide();
     $(this).parents('ul').find('.action-options').toggle();
        e.stopPropagation();
    });

    $(document).click(function (e) {

        $(".menu-button .action-options").hide();
        return true;
    });
});

根据OP要求编辑代码

DEMO

根据提到的要求尝试这个新代码。

$('.menu-button .action-options').hide();
$('.menu-button .actions').click(function (e) {
    if ($(this).parents('ul').find('.action-options').is(':visible')) {

        $(this).parents('ul').find('.action-options').slideUp(10);
        $('.actions').removeClass('active');
    } else {
        $('.menu-button .action-options').slideUp(10);
        $(this).parents('ul').find('.action-options').slideDown(10);
        $('.actions').addClass('active');
    }
    e.stopPropagation();
});
$(document).click(function (e) {

    $(".menu-button .action-options").hide();
    return true;
});

希望对你有帮助,谢谢

【讨论】:

  • 这是一个全新的代码。我无法修改我的代码。有没有办法说如果单击另一个按钮然后隐藏所有其他打开的菜单而不是您刚刚单击的菜单?例如,这里条件在文档单击$(document).click(function() {if ($('.menu-button .js ul').is(':visible')).... 上执行。我尝试使用代码,但无法使其正常工作。
  • 这是我尝试过的$('.menu-button .js .actions').click(function() {if ($(this, 'ul.action-options').siblings().is(':visible')) {$('.menu-button .js ul.action-options', this).slideUp(10);$('.actions').removeClass('active');}});
  • @dimit 你的代码不干净。它会降低性能。当可以用简单的方式完成时,您正在使用很多对象。大量使用 jquery 对象会降低性能
  • @dmit 根据您的需要更改了代码检查上述答案中的编辑。希望这对您有所帮助
  • 感谢您的额外帮助。我很感激。
【解决方案2】:

这样的……

$('.DropDownMenu li').click(function() {
    var $that = $(this);

    // Slides Up, all menu items, and removes class active on Complete.
    $('.DropDown .MenuItem li').slideUp(10, function(){
         $that.removeClass('active');
    });

    // Slides Down, clicked menu item, and adds class "active" on Complete.
    $that.slideDown(10, function(){
         $that.addClass('active');
    });
});

【讨论】:

  • 这对我不起作用,您能否在下一个答案中看到我的两个 cmets,可能会根据该信息提出一些建议?
猜你喜欢
  • 2013-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多