【问题标题】:Dropdown Box with expanding optgroup带有扩展 optgroup 的下拉框
【发布时间】:2012-09-14 10:39:30
【问题描述】:

我正在寻找一个我可以使用的具有可扩展 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 标签支持此操作。如果有人知道我在哪里可以找到有关此的任何信息或很棒的教程。

谢谢

【问题讨论】:

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


    【解决方案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;
    }
    

    【讨论】:

      【解决方案2】:

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

      1. Jquery 手风琴

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

        这是有限的,因为手风琴一次只能打开一个项目。如果用户想一次性比较选项,他们就完蛋了。 Check the docs for more.

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

      3. jqTree (github project here)

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

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

      【讨论】:

      • 感谢您的回复,我已经找到了解决方案,但感谢您的意见。第 2 点和第 3 点是我已经想到的,但认为它们对于我需要的东西来说太过分了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-19
      • 2010-11-26
      • 2018-02-07
      • 1970-01-01
      • 1970-01-01
      • 2015-04-03
      相关资源
      最近更新 更多