样式选择带有jquery和HTML Listelements的字段

时间:2014-04-29 08:20:42

标签: javascript jquery

我的风格Selectfield有点问题。我用这个无序列表元素(UL / LI)和H3。

问题是关闭" Selectfield"点击页面上的任意位置。 当我将点击事件绑定到"文档"时,请不要使用当前的jQuery代码打开SelectField。

我使用CSS隐藏了UL元素(display:none)。 要打开选择字段不是问题。但只有没有$(文件).bind('点击')[...]代码。

我希望有人能为我解决问题。 感谢。

这是我的HTML代码:

<div class="select_container">
   <h3 class="reset">Select Items</h3>
   <ul class="select_elements">
      <li>Select Item 01</li>
      <li>Select Item 02</li>
      <li>Select Item 03</li>
   </ul>
</div>

这里是jQuery代码:

$(document).ready(function(){

    var selectFields = {
        init: function(){

            $('.select_container').on('click',function(){
                $(this).find('ul.select_elements').toggle();
                $(this).find('ul.select_elements').toggleClass('active');
            });

            $(document).bind('click',function(){
                if( $('.select_elements').is(':visible')){
                    $('.select_elements.active').hide();
                }
                else if( $('.select_elements').is(':hidden')){
                    console.log('visible false ...');
                }

            });

        }
    };

    $(selectFields.init);
});

2 个答案:

答案 0 :(得分:0)

  1. 您需要在.stopPropagation函数中使用$('.select_container').on('click')来防止触发$(document).on('click')

  2. 您还需要toggleClass使用$(document).on('click')

    $('.select_container').on('click',function(e){
      $(this).find('ul.select_elements').toggle();
      $(this).find('ul.select_elements').toggleClass('active');
      e.stopPropagation();
    });
    
    $(document).on('click',function(){  
      if( $('.select_elements').is(':visible')){
         $('.active').hide();
         $('.select_elements').toggleClass('active');
      }
      else {
         console.log('visible false ...');
      }
    });
    
  3. FIDDLE

答案 1 :(得分:0)

在jquery和javascript中,事件会冒泡,因此您必须在容器上单击时使用e.stopPropagation()。
检查theese页面linki1link2,您的问题的可能解决方案可能是

<script type="text/javascript">
$(document).ready(function(){
    var selectFields = {
        init: function(){
           $(document).bind('click',function(e){
              if( !$('ul').hasClass('active')){
                 $('ul').hide()
                 $(this).find('ul.select_elements').toggleClass('active');     
                 }
            }); 

           $('.select_container').on('click',function(e){
                 e.stopPropagation()
                 if( $('ul').hasClass('active')){
                 $('ul').show()
                 }else{ $('ul').hide()   }
                 $(this).find('ul.select_elements').toggleClass('active');
            });

        }
    };

    $(selectFields.init);
})
</script>

使用stopPropagation可以防止事件冒泡并在单击列表时被文档捕获 在某些情况下,你也可以使用stopImmediatePropagation来理解stopPropagation和stopImmediatePropagation之间的区别,检查这篇文章Post
类似代码和Batu Zet代码的唯一缺点是,如果您希望单击列表中的项目而不会消失,则必须在ul标记上添加另一个stopPropagation 这是最后的Fiddle