如何关闭一个自定义下拉菜单,当用户点击了其他位置的页面上

问题描述 投票:1回答:3

我工作的自定义选择菜单,需要有菜单选项关闭时永远的用户点击了其他位置上的文件上。但是它没有这样做的,我很困惑。同样,用户可以有多个下拉菜单的同时打开,这也是这不是想要的东西。有人能解释我是如何解决这一问题?

HTML

<body>
    <div class="select">
        <div class="arrow"></div>
        <div class="option-menu">
            <div class="option">Hello</div>
            <div class="option">Goodbye</div>
        </div>
    </div>

    <div class="select">
        <div class="arrow"></div>
        <div class="option-menu">
            <div class="option">A</div>
            <div class="option">B</div>
            <div class="option">C</div>
        </div>
    </div>
</body>

JS

$(document).ready(function(){
    var select = $(".select");
    $(select).on("click", function(){
        select = $(this);
        $(this).find(".option-menu").each(function(){
            $(this).toggle();
        })

        $(".option").on("click", function(){
            $(select).children("p").remove();
            var value = $(this).text();
            $(select).prepend("<p>" +value +"<p>");
        })
    })
})

CSS

body{
    background-color: rgb(200, 200, 200);
}
#main{
    display: block;
    float: left;
    margin-top: 5%;
    margin-left: 15%;
}
.select{
    display: inline-block;
    width: 250px;
    height: 35px;
    border-radius: 8px;
    box-shadow: 0px 0px 3px 3px rgba(0, 0, 0, 0.5);
}
.arrow{
    float: right;
    margin-top: 10px;
    margin-right: 5%;
    height: 80%;
    background-repeat: no-repeat;
    background-size: 100% 100%;
}
.option-menu{
    display: none;
    float: left;
    margin-left: 5px;
    width: 240px;
    box-shadow: 0px 3px 3px 3px rgba(0, 0, 0, 0.5);
}
.option{
    width: 100%;
    cursor: pointer;
}
.active{
    background-color: blue;
}
.select p{
    position: relative;
    float: left;
    top: 10%;
    left: 10%;
    margin: 0;
    padding: 0;
    background-color: red;
}

这也是我的笔。

http://codepen.io/RobbyT15/pen/LIKsJ

javascript jquery
3个回答
1
投票

你可以添加一些类来操作,像current然后就躲当前ELEM

$(this).find(".option-menu").each(function(){
  $('.current').hide();
  if ($(this).hasClass('current')){
     $(this).removeClass('current');
  }else{     
     $(this).show().addClass('current'); 
  } 
})

而隐藏你的菜单不点击它时

$(document).on('click',function(e){
   if ( $(e.target).closest('.select').length === 0 ) {
      $('.current').hide().removeClass('current');
   }
})

CodePen


2
投票

停止在下拉事件的传播:

$('.option-menu').on('click', function(e) {
    e.stopPropagation();
});

$('body').on('click', function(e) {
    $(".option-menu").hide();
});

你告诉选项菜单关闭当你点击身体,但因为事件传播它停止,单击事件将永远不会到达全身,当您单击选项菜单内。

PS:您codepen例如不为我工作,所以我不能提供一个工作的例子。


2
投票
In CoffeeScript, do something like this:

$('.more-btn').on 'click', (e) ->
  if $('.card-content.more').hasClass('show-more-menu')
    $('.card-content.more').removeClass('show-more-menu')

  $(e.target).closest('.card-content.more').addClass('show-more-menu')

$(document).on 'click', ->
  $(".card-content.more").removeClass('show-more-menu')

$('.card-content.more').on 'click', (e) ->
  e.stopPropagation()
© www.soinside.com 2019 - 2024. All rights reserved.