1

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

在鼠标移到 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 标签支持此操作。如果有人知道我在哪里可以找到有关此的任何信息或很棒的教程。

谢谢

4

2 回答 2

1

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;
}
于 2012-09-14T13:26:27.250 回答
0

我认为 html 选择框不可能做到这一点,因为并非所有浏览器都支持选择框中选项组上的鼠标事件。您可能想尝试的几件事是:

  1. jQuery 手风琴

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

    这是有限的,因为手风琴一次只能打开一个项目。如果用户想一次性比较选项,他们就完蛋了。检查文档以获取更多信息

  2. 在单独的字段中使用复选框或类似的东西来控制选择框中的可选内容。这样您就可以简单地禁用某些选项,但它们仍然是可见的,因此用户会知道他们错过了什么。或者您可以完全隐藏可以解决您拥有大量选项的问题的选项。

  3. jqTree (这里是github项目)

我从未使用过它,但它看起来正是您想要的,除了它不使用标准的 html 选择框。

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

于 2012-09-14T13:30:17.800 回答