如何使用CSS隐藏<select>菜单中的<option>?

Jes*_*son 98 javascript css jquery dom

我意识到Chrome似乎不允许我隐藏<option><select>.Firefox会.

我需要隐藏<option>符合搜索条件的s.在Chrome网络工具中,我可以看到display: none;我们的JavaScript 正确设置了它们,但是一旦<select>点击了菜单,就会显示它们.

如何<option>在符合菜单时显示符合我的搜索条件的s?谢谢!

Rya*_*n P 69

您必须实现两种隐藏方法.display: none适用于FF,但不适用于Chrome或IE.因此,第二种方法是包裹<option><span>display: none.FF不会这样做(技术上无效的HTML,根据规范)但Chrome和IE将会隐藏该选项.

编辑:哦是的,我已经在jQuery中实现了这个:

jQuery.fn.toggleOption = function( show ) {
    jQuery( this ).toggle( show );
    if( show ) {
        if( jQuery( this ).parent( 'span.toggleOption' ).length )
            jQuery( this ).unwrap( );
    } else {
        if( jQuery( this ).parent( 'span.toggleOption' ).length == 0 )
            jQuery( this ).wrap( '<span class="toggleOption" style="display: none;" />' );
    }
};
Run Code Online (Sandbox Code Playgroud)

编辑2:以下是使用此功能的方法:

jQuery(selector).toggleOption(true); // show option
jQuery(selector).toggleOption(false); // hide option
Run Code Online (Sandbox Code Playgroud)

编辑3:添加了@ user1521986建议的额外检查

  • 虽然这个解决方案确实隐藏了元素,但任何尝试读取`<select>`的值(使用jQuery的`.val()`)都会返回`null`.我刚刚在Chrome 29中对此进行了测试,因此Google员工要小心! (17认同)
  • 小心这个.它起初似乎工作得很好,但是沿着它停止的某个地方.这是一个小演示:http://jsfiddle.net/Yb6sk/9/ (15认同)
  • 有趣的黑客,但我建议尽可能避免"技术上无效的HTML". (7认同)
  • 没错,所有浏览器都有不同的实现.但浏览器无法严格执行标准规范的一个原因是因为存在太多不符合规范的实时代码.IMO:如果没有其他解决方案,那么一定要使用hack.但如果你能按照规范*和*解决你的问题,为什么不呢?它可以帮助您的代码与其他人一起玩,并有助于加强规范. (3认同)

Luk*_*nek 64

对于HTML5,您可以使用"隐藏"属性.

<option hidden>Hidden option</option>
Run Code Online (Sandbox Code Playgroud)

IE <11 支持它.但是如果你只需要隐藏一些元素,那么与添加/删除元素或没有语义正确的构造相比,将隐藏属性与disabled结合使用会更好.

<select>  
  <option>Option1</option>
  <option>Option2</option>
  <option hidden>Hidden Option</option>
</select>
Run Code Online (Sandbox Code Playgroud)

参考.

  • 在Safari(v8.0.5)中不起作用. (11认同)
  • 这是现代的答案.理想情况下,我们也将其设置为"禁用",以便那些不支持[HTML5全局`hidden`属性]的浏览器(https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/hidden)将为用户提供一些视觉指示. (6认同)
  • 在Safari,Edge和IE中不起作用.[Safari for Safari](https://bugs.webkit.org/show_bug.cgi?id=8351)已有10年历史,请通过更新现有补丁来提供帮助.在边缘问题跟踪器中找不到错误. (5认同)
  • IE 11支持这一点. (4认同)
  • 解决方法是使用`<option hidden disabled>`,因此它隐藏在所有好的浏览器中,并在其他浏览器上禁用它. (4认同)
  • 看起来“隐藏”全部绿灯:https://caniuse.com/#feat=hidden (3认同)
  • 你如何在 CSS 中使用这种技术? (2认同)

Luk*_*uke 34

我会建议你做使用使用该解决方案的<span>包装,因为它不是有效的HTML,这可能导致在路上的问题.我认为首选的解决方案是实际删除您要隐藏的任何选项,并根据需要还原它们.使用jQuery,您只需要这3个函数:

第一个函数将保存选择的原始内容.为了安全起见,您可能希望在加载页面时调用此函数.

function setOriginalSelect ($select) {
    if ($select.data("originalHTML") == undefined) {
        $select.data("originalHTML", $select.html());
    } // If it's already there, don't re-set it
}
Run Code Online (Sandbox Code Playgroud)

下一个函数调用上述函数以确保已保存原始内容,然后简单地从DOM中删除选项.

function removeOptions ($select, $options) {
    setOriginalSelect($select);
    $options.remove();
 }
Run Code Online (Sandbox Code Playgroud)

只要您想"重置"回所有原始选项,就可以使用最后一个功能.

function restoreOptions ($select) {
    var ogHTML = $select.data("originalHTML");
    if (ogHTML != undefined) {
        $select.html(ogHTML);
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,所有这些函数都希望您传入jQuery元素.例如:

// in your search function...
var $s = $('select.someClass');
var $optionsThatDontMatchYourSearch= $s.find('options.someOtherClass');
restoreOptions($s); // Make sure you're working with a full deck
removeOptions($s, $optionsThatDontMatchYourSearch); // remove options not needed
Run Code Online (Sandbox Code Playgroud)

这是一个工作示例:http://jsfiddle.net/9CYjy/23/

  • 可靠而不是黑客.很棒的答案! (2认同)

Jef*_*ffT 18

Ryan P的答案应改为:

    jQuery.fn.toggleOption = function (show) {
        $(this).toggle(show);
        if (show) {
            if ($(this).parent('span.toggleOption').length)
                $(this).unwrap();
        } else {
            **if ($(this).parent('span.toggleOption').length==0)**
                $(this).wrap('<span class="toggleOption" style="display: none;" />');
        }
    };
Run Code Online (Sandbox Code Playgroud)

否则它会包含太多标签

  • 请注意,根据HTML规范(http://www.w3.org/TR/html5/forms.html#the-select-element),`<select>`应该只包含`<option>`或`< optgroup>`或脚本支持元素.所以你应该避免使用无效的`<span>`包装器. (4认同)

Bat*_*ler 9

toggleOption函数并不完美,并在我的应用程序中引入了令人讨厌的错误.jQuery会与.val()和.arraySerialize()混淆尝试选择选项4和5以查看我的意思:

<select id="t">
<option value="v1">options 1</option>
<option value="v2">options 2</option>
<option value="v3" id="o3">options 3</option>
<option value="v4">options 4</option>
<option value="v5">options 5</option>
</select>
<script>
jQuery.fn.toggleOption = function( show ) {
    jQuery( this ).toggle( show );
    if( show ) {
        if( jQuery( this ).parent( 'span.toggleOption' ).length )
            jQuery( this ).unwrap( );
    } else {
        jQuery( this ).wrap( '<span class="toggleOption" style="display: none;" />' );
    }
};

$("#o3").toggleOption(false); 
$("#t").change(function(e) {
    if($(this).val() != this.value) {
    console.log("Error values not equal", this.value, $(this).val());
    }
});
</script>
Run Code Online (Sandbox Code Playgroud)


Jas*_*per 8

以这种方式选择输入很棘手.如果禁用它,这将跨浏览器工作:

$('select').children(':nth-child(even)').prop('disabled', true);
Run Code Online (Sandbox Code Playgroud)

这将禁用所有其他<option>元素,但您可以选择您想要的任何元素.

这是一个演示:http://jsfiddle.net/jYWrH/

注意:如果要删除可以使用的元素的disabled属性.removeProp('disabled').

更新

您可以<option>在隐藏的选择元素中保存要隐藏的元素:

$('#visible').on('change', function () {
    $(this).children().eq(this.selectedIndex).appendTo('#hidden');
});
Run Code Online (Sandbox Code Playgroud)

然后,您可以将<option>元素添加回原始的select元素:

$('#hidden').children().appendTo('#visible');
Run Code Online (Sandbox Code Playgroud)

在这两个示例中,期望可见的select元素具有id,visible而隐藏的select元素具有id hidden.

这是一个演示:http://jsfiddle.net/jYWrH/1/

请注意,这.on()是jQuery 1.7中的新增内容,此答案的用法与以下内容相同.bind():http://api.jquery.com/on


Nie*_*sol 6

简单回答:你做不到.表单元素的样式功能非常有限.

最好的选择是设置disabled=true选项(也许是灰色,因为只有IE会自动执行此操作),这将使选项无法点击.

或者,如果可以,请完全删除option元素.


小智 6

// Simplest way

var originalContent = $('select').html();

$('select').change(function() {
    $('select').html(originalContent); //Restore Original Content
    $('select option[myfilter=1]').remove(); // Filter my options
});
Run Code Online (Sandbox Code Playgroud)