【问题标题】:How do I make a drop down menu close as another from the same class opens in jquery / javascript?当同一个类中的另一个在 jquery / javascript 中打开时,如何关闭下拉菜单?
【发布时间】:2012-04-06 20:16:43
【问题描述】:

我创建了一个下拉菜单,其中包含可供点击的链接,用户可以通过这些链接删除消息、阻止对帖子发表评论等。

无论如何,这一切都按预期工作..但是有一些行为我想停止。如果用户单击箭头以显示下拉菜单,它会显示这很好,但是当用户滚动到另一条消息/帖子并再次单击箭头时,两个下拉菜单都保持打开状态。

  1. 我希望在打开另一个菜单时关闭当前菜单。所以一次只能打开一个菜单。

  2. 由于某种原因,当我在页面刷新后第一次单击箭头下拉菜单时,箭头悬停状态会在我滚动时闪烁一次。有没有办法阻止这一切?

这是我当前的代码:

jquery:

$(".micropostOptions").click(function(e) {

    var $micropostOptions = $(this),
        $postMenu = $micropostOptions.children();

    e.stopPropagation();

        if ($postMenu.hasClass("postMenuActivate")) {
            $postMenu.hide().removeClass("postMenuActivate");
            $micropostOptions.removeClass("postMenuHoverState");
        } else {
            $postMenu.show(10).addClass("postMenuActivate");
            $micropostOptions.addClass('postMenuHoverState');
        };

});

sCSS:

.micropostOptions {
    position:absolute;
    height:17px;
    width:17px  ;
    top:5px;
    right:5px;
    background:white url("/assets/arrow_down_alt1.png") no-repeat;
    background-position:0px 0px;

        &:hover {
            background: url("/assets/arrow_down_alt1_hover.png") no-repeat; 
            background-position:0px 0px;
            cursor:pointer !important;

        }

}

.postMenuActivate {
    display:block;
}

.postMenuHoverState {
    background: url("/assets/arrow_down_alt1_hover.png") no-repeat; 
    background-position:0px 0px;
    cursor:pointer !important;
}

.postMenu {
    position:absolute;
    display:none;
    padding-bottom:20px;
    background-color:white !important;
    border:1px solid $main-background-color;
    height:163px;
    width:170px;
    top:18px;
    right:2px;
    -webkit-box-shadow: 0 10px 6px -6px #777;
    -moz-box-shadow: 0 10px 6px -6px #777;
    box-shadow: 0 10px 6px -6px #777;
    color:gray;
    z-index:3000;

        li {

        font-size:12px;
        height:33px;
        background-color:white !important;

            a span {
                float:left;
                width:160px;
                height:33px;
                line-height:33px;
                padding-left:10px;
                color:gray;

                  &:hover {
                    background-color:#4D90FE !important;
                    color:white;
                    //  #DD4B39,#D14836
                    }
            }

            &:hover {
            background-color:#4D90FE;
            color:white;

            }
        }

        .deletePost {
            //position:relative;
            padding-top:0px !important;
            padding-left:0px !important;
            height:39px;
            width:170px;
            text-align:center;
            padding-bottom:7px;
            border-bottom:1px solid #d9d9d9;

                a {

                    span {
                    float:left;
                    padding-left:0px !important;                            
                        height:46px !important;
                        width:170px !important;
                        line-height:46px;
                    }
                }

                a span:hover {
                    background-color:#DD4B39 !important;
                    color:white;
                //  #DD4B39,#D14836
                }
        }

        .reportAbuse {
            border-top:1px solid #d9d9d9;

                a span:hover {
                    background-color:gray !important;;
                }

        }

}

HTML:

    <nav class="micropostOptions">
     <ul class="postMenu">
       <li class="deletePost"><%= link_to content_tag(:span, "Delete post"), m, :method => :delete, :confirm => "Are you sure?", :title => m.content, :class => "message_delete" %>
       </li>
       <li class="disableCommenting"><%= link_to content_tag(:span, "Pause commenting"), "2" %></li>
       <li class="blockCommenter"><%= link_to content_tag(:span, "Block commenter"), "3" %></li>
       <li class="openInNewWindow"><%= link_to content_tag(:span, "Open in new window"), "4" %></li>
       <li class="reportAbuse"><%= link_to content_tag(:span, "Report abuse"), "5" %></li>
     </ul>  
   </nav>

亲切的问候

【问题讨论】:

  • 我们可以用没有 HTML 的 CSS 做什么?一个 jsFiddle 会非常好!
  • 很抱歉。现在添加了 HTML。
  • 添加了一个演示。复制 jQuery 并告诉我结果

标签: javascript jquery jquery-selectors


【解决方案1】:

我无法在演示中复制您的代码,因此我更改了 CSS:

jsFiddle demo

$('.micropostOptions').on('click',function(){
    var postMenu = $(this).find('.postMenu');
    
    if( postMenu.is(':hidden') ){
        $('.postMenu').slideUp();
        postMenu.slideDown();
    }else{
        postMenu.slideUp() ;
    }
});

【讨论】:

  • 这行得通,但看到我讨厌幻灯片效果,我使用了隐藏和显示。非常有趣的是,这少量的代码是如何完成我的代码所做的以及更多。显示了在 jquery 方面我必须学习多少。我将如何做到这一点,以便当我舔页面上的任何位置时菜单也会关闭?
  • @LondonGuy 呵呵,谢谢。是的,总有东西要学! - 要隐藏可见的,您必须停止点击传播并添加几行,例如:jsfiddle.net/up5yq/6Happy coding!
  • :) 关于“少量代码”和“学习”jsfiddle.net/up5yq/7 :D 关于“幻灯片”效果与隐藏/显示,我认为从用户体验的角度来看 -滑动/淡入淡出效果更合适,允许用户在逻辑上遵循(理解)页面上的操作/更改。
【解决方案2】:

这里有点盲目,因为我们只有一个菜单,但这能解决问题吗?

$(".micropostOptions").click(function(e) {

    var $micropostOptions = $(this),
        $postMenu = $micropostOptions.children();

    e.stopPropagation();

        if ($postMenu.hasClass("postMenuActivate")) {
            $postMenu.hide().removeClass("postMenuActivate");
            $micropostOptions.removeClass("postMenuHoverState");
        } else {
            $postMenu.show(10).addClass("postMenuActivate");
            $micropostOptions.addClass('postMenuHoverState');
            $(".micropostOptions.postMenuHoverState")  //selects all micropostOptions with the postMenuHoverState class
                .not($micropostOptions)  //removes the current micropostOptions from the selected set
                .removeClass('postMenuHoverState')  //removes the postMenuHoverState class from all micropostOptions (besides teh current one)
                .children()  //gets the child menus of the set
                    .removeClass('postMenuActivate');  //removes postMenuActivate class from children of the active (but not current) micropostOptions

        };

});

【讨论】:

    【解决方案3】:

    我认为,您应该看看 jQuery 的 blur() 事件处理程序,以在元素失去焦点时触发事件: http://api.jquery.com/blur/

    【讨论】:

    • 我认为不是。这个问题与模糊无关。如果单击已关闭的项目,OP 希望隐藏“已打开”的项目。 (如果我理解得很好……)
    • 对,blur() 可能是潜在解决方案的一部分。但由于我们没有进一步的信息,这只是一个猜测。
    猜你喜欢
    • 1970-01-01
    • 2013-04-11
    • 1970-01-01
    • 2020-08-11
    • 2021-08-15
    • 2022-10-13
    • 1970-01-01
    • 2018-10-18
    • 1970-01-01
    相关资源
    最近更新 更多