下拉框与扩展optgroup

时间:2012-09-14 10:39:30

标签: javascript jquery html jquery-ui jquery-plugins

我正在寻找一个可以使用的具有可扩展选择组的选择框

在鼠标移动到optgroup标签

之前,不应显示组中的选项
<select>
 <optgroup label="group 1"> 
  <option>1</option> <!-- Options within this group hidden until mouseover its group label -->
  <option>2</option>
  <option>3</option>
  <option>4</option> 
 </optgroup>
 <optgroup label="group 2">
  <option>1</option> <!-- Options within this group hidden until mouseover its group label -->
  <option>2</option>
  <option>3</option>
  <option>4</option>
 </optgroup>
 <optgroup label="group 3">
  <option>1</option> <!-- Options within this group hidden until mouseover its group label -->
  <option>2</option>
  <option>3</option>
  <option>4</option>
 </optgroup>
</select>

我希望能够做到这一点,因为我会有一些非常大的选择,这将有助于打破它们。

如果我无法通过HTML选择框+ JS执行此操作,我想构建一个使用DIV标记支持此功能的自定义下拉列表。如果有人知道我在哪里可以找到关于这个或教程的任何信息,那将是很棒的。

由于

2 个答案:

答案 0 :(得分:0)

NVM我找到了一个有效的解决方案,

我必须使用HTML,CSS和JS来实现我想要的目标。

我复制了这个教程 http://www.onextrapixel.com/2012/06/20/create-a-custom-select-box-with-jquery/

并添加了生成组和功能所需的额外位。

适合我的代码如下......

这是用于生成布局的HTML

  <div class='selectBox'>
    <span class='selected'>Reset Filter</span> <span class=
    'selectArrow'>&amp;#9660</span>
    <div class="selectOptions">
      <div>
        <span class="selectOption c1" value="reset" group="0">Reset Filter</span>
      </div>
      <div>
        <span class="selectOption c1" value="online_booking" group="1">Online
        Booking</span>
      </div>
      <div>
        <span class="selectOptionGroup" value="2">&gt;&gt; Services Offered</span>
        <span class="selectOption" value="SERVICING" group="2">SERVICING</span>
        <span class="selectOption" value="MOT TESTING" group="2">MOT TESTING</span>
        <span class="selectOption" value="TYRES" group="2">TYRES</span>
      </div>
      <div>
        <span class="selectOptionGroup" value="3">&gt;&gt; Car Manufacturer</span>
        <span class="selectOption" value="ALFA ROMEO" group="3">ALFA ROMEO</span>
        <span class="selectOption" value="ASTON MARTIN" group="3">ASTON MARTIN</span>
        <span class="selectOption" value="AUDI" group="3">AUDI</span>
      </div>
    </div>
  </div>

这是创建下拉列表的Jquery JS代码

    function enableSelectBoxes(){
            $('div.selectBox').each(function(){
                $(this).children('span.selected').html($(this).children('div.selectOptions').children('span.selectOption:first').html());
                $(this).attr('value',$(this).children('div.selectOptions').children('span.selectOption:first').attr('value'));

                $(this).children('span.selected,span.selectArrow').click(function(){
                        if($(this).parent().children('div.selectOptions').css('display') == 'none'){
                                $(this).parent().children('div.selectOptions').css('display','block');
                        }
                        else
                        {
                                $(this).parent().children('div.selectOptions').css('display','none');
                        }
                });

                $(this).find('span.selectOption').click(function(){
                        $(this).parent().parent().css('display','none');
                        $(this).closest('div.selectBox').attr('value',$(this).attr('value'));
                        $(this).parent().parent().siblings('span.selected').html($(this).html());
                        $("#filter_type").val($(this).attr("group"));
                        $("#filter_value").val($(this).attr("value"));
                });

                $(this).find('span.selectOptionGroup').click(function(){
                    var group = $(this).attr("value");
                    $(this).parent().children("span[group='" + group + "']").each(function(){
                        if($(this).css("display") == "block") {
                            $(this).css("display", "none");
                        }
                        else {
                            $(this).css("display", "block");
                        }
                    });
                });
            });
    }

最后是CSS

div.selectBox {
    position: relative;
    display: inline-block;
    cursor: default;
    text-align: left;
    line-height: 30px;
    clear: both;
    color: #888;
    margin-top: 20px;
}

span.selected {
    width: 167px;
    text-indent: 20px;
    border: 1px solid #ccc;
    border-right: none;
    border-top-left-radius: 5px;
    border-bottom-left-radius: 5px;
    background: #f6f6f6;
    overflow: hidden;
}

span.selectArrow {
    width: 30px;
    border: 1px solid #9FD573;
    border-top-right-radius: 5px;
    border-bottom-right-radius: 5px;
    text-align: center;
    font-size: 20px;
    -webkit-user-select: none;
    -khtml-user-select: none;
    -moz-user-select: none;
    -o-user-select: none;
    user-select: none;
    background: #9FD573;
}

span.selectArrow,span.selected {
    position: relative;
    float: left;
    height: 30px;
    z-index: 1;
}

div.selectOptions {
    position: absolute;
    top: 28px;
    left: 0;
    width: 198px;
    border: 1px solid #ccc;
    border-bottom-right-radius: 5px;
    border-bottom-left-radius: 5px;
    overflow: hidden;
    background: #f6f6f6;
    padding-top: 2px;
    display: none;
    max-height: 400px;
    overflow: auto;
}

span.selectOption, span.selectOptionGroup {
    width: 80%;
    line-height: 20px;
    padding: 5px 10%;
}


span.selectOption{
    display: none;
}

span.selectOption:hover, span.selectOptionGroup:hover {
    color: #f6f6f6;
    background: #4096ee;
}

span.selectOptionGroup {
    display: block;
    font-weight: bold;
    font-style: italic;
}

答案 1 :(得分:0)

我不认为使用html选择框可以实现这一点,因为并非所有浏览器都支持选择框中选项组上的鼠标事件。您可能想要尝试的一些事情是:

  1. Jquery手风琴

    $(document).ready(function() {$("#accordion").accordion();});
    

    这是有限的,因为手风琴一次只能打开一个项目。如果用户想要同时比较选项,那么他们就会被搞砸。 Check the docs for more

  2. 在单独的字段中使用复选框或类似内容来控制选择框中可选择的内容。通过这种方式,您可以简单地禁用某些选项,但它们仍然可见,因此用户可以知道它们丢失的位置。或者你可以完全隐藏可以解决你有大量选择问题的选项。

  3. jqTree (github project here)

  4. 我从来没有使用过这个,但它看起来就像你想要的那样,除了它没有使用标准的html选择框。

    我注意到你刚刚回答了自己的问题,但我还是会发帖,因为jqTree可能很有用,其他人应该知道标准html选择框不支持optgroups上的鼠标事件