如何使用 JavaScript 隐藏选择选项?(跨浏览器)

IT技术 javascript jquery cross-browser
2021-01-20 23:37:17

这应该有效:

$('option').hide(); // hide options

它适用于 Firefox,但不适用于 Chrome(可能不适用于 IE,未经测试)。

一个更有趣的例子:

<select>
    <option class="hide">Hide me</option>
    <option>visible option</option>
</select>
<script type="text/javascript">
// try to hide the first option
$('option.hide').hide();

// to select the first visible option
$('option:visible').first().attr('selected', 'selected');
</script>

或查看http://jsfiddle.net/TGxUf/ 上的示例

是从 DOM 中分离选项元素的唯一选择吗?我需要稍后再向他们展示,所以这不会很有效。

6个回答

不幸的是,您无法option在所有浏览器中隐藏元素。

过去当我需要这样做时,我已经设置了它们的disabled属性,就像这样......

$('option').prop('disabled', true);

然后,我使用这段 CSS 在浏览器支持的地方使用了隐藏...

select option[disabled] {
    display: none;
}
在回答另一个问题时制作了一个普通的 JS 演示片段stackoverflow.com/questions/57511712/...
2021-03-18 23:37:17
如果从这个答案中不清楚。禁用和显示在 Firefox、Chrome 和 Edge 中无效,但不适用于 IE 或 Safari (2018/2019)
2021-03-22 23:37:17
@dave1010 然后您唯一的选择是构建options的对象,并根据需要删除和附加。
2021-03-30 23:37:17
这是一个好的开始,但我真的需要在所有浏览器中删除这些选项。
2021-04-04 23:37:17

如前所述,您不能display:none单独使用<option>s,因为它们不是正确的 DOM 元素类型。

您可以设置.prop('disabled', true),但这只会使元素变灰并使它们无法选择——它们仍然占用空间。

一种解决方案我的用途是.detach()<select>进入页面加载一个全局变量,然后添加回的只有<option>你想按需秒。像这样的东西(http://jsfiddle.net/mblase75/Afe2E/):

var $sel = $('#sel option').detach(); // global variable

$('a').on('click', function (e) {
    e.preventDefault();
    var c = 'name-of-class-to-show';
    $('#sel').empty().append( $sel.filter('.'+c) );
});

起初我还以为你不得不.clone()<option>小号追加在他们面前,但显然不是。代码运行$sel原全局不变click


如果您不喜欢全局变量,则可以将包含选项的 jQuery 对象存储为元素本身.data()变量<select>http://jsfiddle.net/mblase75/nh5eW/):

$('#sel').data('options', $('#sel option').detach()); // data variable

$('a').on('click', function (e) {
    e.preventDefault();
    var $sel = $('#sel').data('options'), // jQuery object
        c = 'name-of-class-to-show';
    $('#sel').empty().append( $sel.filter('.'+c) );
});
感谢您的回答,对我帮助很大。
2021-04-03 23:37:17
这对我有帮助,关键是使用 $.detach() (或 $.remove()) 来实现最大的跨浏览器兼容性而不是 $.hide()
2021-04-06 23:37:17

我自己对此有所了解,这就是我想出的:

(function($){

    $.fn.extend({detachOptions: function(o) {
        var s = this;
        return s.each(function(){
            var d = s.data('selectOptions') || [];
            s.find(o).each(function() {
                d.push($(this).detach());
            });
            s.data('selectOptions', d);
        });
    }, attachOptions: function(o) {
        var s = this;
        return s.each(function(){
            var d = s.data('selectOptions') || [];
            for (var i in d) {
                if (d[i].is(o)) {
                    s.append(d[i]);
                    console.log(d[i]);
                    // TODO: remove option from data array
                }
            }
        });
    }});   

})(jQuery);

// example
$('select').detachOptions('.removeme');
$('.b').attachOptions('[value=1]');');

你可以在http://www.jsfiddle.net/g5YKh/看到这个例子

option元件被从完全除去selectS和可再加入由jQuery选择一次。

在它适用于所有情况之前可能需要一些工作和测试,但它足以满足我的需要。

我在 IE8 上运行时遇到了 dave1010 的回答问题。attachOptions 函数中的 if (d[i].is(o)) 调用导致“对象不支持此属性或方法”消息。
2021-03-19 23:37:17
以下是完成“待办事项”部分的方法。您必须将 for 循环更改为“for (var i = 0; i < d.length; i++) {”,然后在 TODO 下面添加:“d.splice(i,1); i--;”
2021-03-19 23:37:17
我真的不想接受我自己的答案,但是,除非有人想出更好的办法,否则我可能不得不:-)
2021-03-21 23:37:17

我知道这有点晚了,但迟到总比没有好!这是实现这一目标的非常简单的方法。只需具有显示和隐藏功能。hide 函数只会将每个选项元素附加到一个预先确定的(隐藏的)span 标签(它应该适用于所有浏览器),然后 show 函数只会将该选项元素移回您的 select 标签。;)

function showOption(value){
    $('#optionHolder option[value="'+value+'"]').appendTo('#selectID');             
}

function hideOption(value){
    $('select option[value="'+value+'"]').appendTo('#optionHolder');
}
不知道为什么这个 andwer 被否决了。它确实解决了这个问题,而且做得很好。
2021-03-14 23:37:17
有趣的想法。我想临时容器甚至不必附加到 DOM(例如,只是用 with 创建document.createElement())。
2021-03-20 23:37:17

隐藏<option>元素不在规范中。但是你可以使用disable它们,这应该可以跨浏览器工作。

$('option.hide').prop('disabled', true);

http://www.w3.org/TR/html401/interact/forms.html#h-17.6