使用jQuery隐藏选择列表中的选项


98

我有一个对象,具有要从选择列表中隐藏/删除的选项的键/值对。以下两个选项选择器都不起作用。我想念什么?

$.each(results['hide'], function(name, title) {                     
  $("#edit-field-service-sub-cat-value option[value=title]").hide();
  $("#edit-field-service-sub-cat-value option[@value=title]").hide();
}); 

12
您确定接受的答案对x浏览器有效吗;)我会讨厌其他人通过Google找到此问与答,而走错了印象!
redsquare

@redsquare-这就是为什么我发布了指向另一个问题的链接,该问题与在不跨浏览器的选择中隐藏选项元素有关:)
Russ Cam


我发现,如果在Chrome 57.0中调用hide()后隐藏了选定的元素,那么您还必须取消选择该元素
omarjebari

Answers:


127

值得一提的是,@jQuery 1.3中不存在第二种形式(带有)。第一个不起作用,因为您显然期望变量插值。试试这个:

$("#edit-field-service-sub-cat-value option[value=" + title + "]").hide();

请注意,如果title包含jQuery选择器元字符,这可能会以各种可怕的方式破坏。


50
隐藏选项是不是跨浏览器兼容。
mpen 2011年

1
用单引号将解决大多数jquery元字符问题
peterjwest


这个概念为我提供了另一个解决方案。谢谢
Ajay Kumar '18

通常,当隐藏<options />时,会感到疲倦,这不会更新所选的值。隐藏后,您需要选择一个新选项。如果您在optgroup中工作,则遍历DOM会很棘手。
Solvitieg

80

您无法执行此x浏览器。如果我记得有问题。最简单的操作是在删除项目之前保留select的克隆副本,这使您可以轻松删除然后将缺少的项目重新添加回去。


2
取回选项将不是问题,因为它是依赖下拉列表的一部分,每次更改时,ajax都会调用服务器来更新选项。但这是hide()在IE中不起作用的情况吗?
hitfactory

确实,即不会隐藏它们。不确定ie8,但肯定
无法

pastebin链接示例也不会在Chrome中隐藏该选项
slolife

5
这是一个适用于跨浏览器的答案 - 这里有一个示例-我已经在IE6-9,Chrome和FF中进行了测试
Tr1stan 2011年

请在下面的IE,FF,Chrome和Safari中查看我的答案。这是最灵活的选项(允许与显示的文本不同的值)。
Sablefoste

53

我找到了一种更好的方法,它非常简单:

$("option_you_want_to_hide").wrap('<span/>')

要再次显示,只需找到该选项(不跨度)和即可$("option_you_want_to_show").unwrap()

已在Chrome和Firefox 上进行了测试。


3
你真是个天才!跨浏览器魔术只有一排。
manudea 2014年

凉。很好地处理了跨浏览器问题。
Subrat Pattnaik 2015年

我赞成这一点,但如果实施不当,则会搞砸:例如,您不能使用$("select").val("0").trigger("change")
clod986

2
您使用包装/展开会失去太多控制。很容易意外地解开尚未包装的元素,从而将其父元素剥离。另外,它还会搞乱CSS选择器。使用show / hide更好,尽管您仍然需要记住也要取消选择任何选定的元素:$('selector-for-dropdown')。val('');
omarjebari

1
我喜欢wrap / uwnrap解决方案。只需确保我们不对已包装的包装进行双重包装即可。与未包装的包装类似的想法。
匿名

47

这是我的想法,由于本地DOM方法的缘故,速度可能会更快

$.each(results['hide'], function(name, title) {                     
    $(document.getElementById('edit-field-service-sub-cat-value').options).each(function(index, option) {
      if( option.value == title ) {
        option.hidden = true; // not fully compatible. option.style.display = 'none'; would be an alternative or $(option).hide();
      }
    });
});

14

这在Firefox 3.0中有效,但在MSIE 8中或Opera 9.62中均无效:

jQuery('#destinations').children('option[value="1"]').hide();
jQuery('#destinations').children('option[value="1"]').css('display','none');

但是宁可隐藏一个选项,也可以将其禁用:

jQuery('#destinations').val('2'); 
jQuery('#destinations').children('option[value="1"]').attr('disabled','disabled');

上面两行中的第一行适用于Firefox,并将焦点传递给第二个选项(假设它的值为value =“ 2”)。如果我们忽略它,则该选项被禁用,但是在我们将其下拉之前,它仍显示“ enabled”选项。因此,我们将注意力转移到另一种选择上来避免这种情况。


12

可以跨浏览器完成;它只需要一些自定义编程。请访问http://jsfiddle.net/sablefoste/YVMzt/6/查看我的提琴。经过测试可在Chrome,Firefox,Internet Explorer和Safari中运行。

简而言之,我有一个隐藏字段,#optionstore它按顺序存储数组(因为JavaScript中没有关联数组)。然后,当您更改类别时,它将解析现有选项(仅第一次),将其写入#optionstore,擦除所有内容,并仅放回与该类别关联的选项。

注意:我创建此选项是为了允许与显示给用户的文本不同的选项值,因此它具有很高的灵活性。

HTML:

<p id="choosetype">
    <div>
        Food Category:
    </div>
    <select name="category" id="category" title="OPTIONAL - Choose a Category to Limit Food Types" size="1">
        <option value="">All Food</option>
        <option value="Food1">Fruit</option>
        <option value="Food2">Veggies</option>
        <option value="Food3">Meat</option>
        <option value="Food4">Dairy</option>
        <option value="Food5">Bread</option>
    </select>
    <div>
        Food Selection
    </div>
    <select name="foodType" id="foodType" size="1">
        <option value="Fruit1" class="sub-Food1">Apples</option>
        <option value="Fruit2" class="sub-Food1">Pears</option>
        <option value="Fruit3" class="sub-Food1">Bananas</option>
        <option value="Fruit4" class="sub-Food1">Oranges</option>
        <option value="Veg1" class="sub-Food2">Peas</option>
        <option value="Veg2" class="sub-Food2">Carrots</option>
        <option value="Veg3" class="sub-Food2">Broccoli</option>
        <option value="Veg4" class="sub-Food2">Lettuce</option>
        <option value="Meat1" class="sub-Food3">Steak</option>
        <option value="Meat2" class="sub-Food3">Chicken</option>
        <option value="Meat3" class="sub-Food3">Salmon</option>
        <option value="Meat4" class="sub-Food3">Shrimp</option>
        <option value="Meat5" class="sub-Food3">Tuna</option>
        <option value="Meat6" class="sub-Food3">Pork</option>
        <option value="Dairy1" class="sub-Food4">Milk</option>
        <option value="Dairy2" class="sub-Food4">Cheese</option>
        <option value="Dairy3" class="sub-Food4">Ice Cream</option>
        <option value="Dairy4" class="sub-Food4">Yogurt</option>
        <option value="Bread1" class="sub-Food5">White Bread</option>
        <option value="Bread2" class="sub-Food5">Panini</option>
    </select>
    <span id="optionstore" style="display:none;"></span>
</p>

JavaScript / jQuery:

$(document).ready(function() {
    $('#category').on("change", function() {
        var cattype = $(this).val();
        optionswitch(cattype);
    });
});

function optionswitch(myfilter) {
    //Populate the optionstore if the first time through
    if ($('#optionstore').text() == "") {
        $('option[class^="sub-"]').each(function() {
            var optvalue = $(this).val();
            var optclass = $(this).prop('class');
            var opttext = $(this).text();
            optionlist = $('#optionstore').text() + "@%" + optvalue + "@%" + optclass + "@%" + opttext;
            $('#optionstore').text(optionlist);
        });
    }

    //Delete everything
    $('option[class^="sub-"]').remove();

    // Put the filtered stuff back
    populateoption = rewriteoption(myfilter);
    $('#foodType').html(populateoption);
}

function rewriteoption(myfilter) {
    //Rewrite only the filtered stuff back into the option
    var options = $('#optionstore').text().split('@%');
    var resultgood = false;
    var myfilterclass = "sub-" + myfilter;
    var optionlisting = "";

    myfilterclass = (myfilter != "")?myfilterclass:"all";

    //First variable is always the value, second is always the class, third is always the text
    for (var i = 3; i < options.length; i = i + 3) {
        if (options[i - 1] == myfilterclass || myfilterclass == "all") {
            optionlisting = optionlisting + '<option value="' + options[i - 2] + '" class="' + options[i - 1] + '">' + options[i] + '</option>';
            resultgood = true;
        }
    }
    if (resultgood) {
        return optionlisting;
    }
}

您能否解释一下resultgood变量的用法?我们删除了它的用法,因为当用户有一个过滤列表并且用户输入一个表示没有要显示的项目的字符时,实际上不会显示一个空列表-代码继续列出与搜索字词匹配的项目,而没有额外的字符。我们的用例与示例略有不同-我们使用输入字段来接受搜索词的输入。
B5A7

resultgood是一个简单的检查,看看是否有optionlisting加。如果是,<option>则返回s 的列表。如果没有,则不返回任何内容,如果不小心包含了一个实际上不存在的类(在此示例中,例如sub-Food6),这就是您想要的。要在下拉菜单中返回空格,请将函数开始处的声明行更改为var optionlisting="<option value=''></option>";
Sablefoste

顺便说一句,如果我今天要写这个,我可能不会使用类作为信息载体,而是使用data属性。在语义上更正确。
Sablefoste

是。我们做的一样。
B5A7

5

最好的选择是在要禁用的选项项上设置disable = true,然后在CSS中设置

option:disabled {
    display: none;
}

这样,即使浏览器不支持隐藏禁用的项目,但它仍然无法选择。但对浏览器支持的话,他们将被隐藏。


4

看看这个问题和答案-

禁用选择选项...

查看您的代码,您可能需要引用属性值

$("#edit-field-service-sub-cat-value option[value='title']").hide();

jQuery属性选择器

在大多数情况下,引号是可选的,但当值包含“]”这样的字符时,应使用引号来避免冲突

编辑:

刚意识到您正在从function参数获取标题,在这种情况下,语法应为

$("#edit-field-service-sub-cat-value option[value='" + title + "']").hide();

4

关于redsquare的建议,我最终这样做:

var selectItems = $("#edit-field-service-sub-cat-value option[value=" + title + "]").detach();

然后扭转这种情况:

$("#edit-field-service-sub-cat-value").append(selectItems);

3

问题在于Internet Explorer似乎不支持选择选项的隐藏和显示方法。我想隐藏我的ddlReasonCode select的所有选项,这些选项没有当前选择的类型作为属性“ attType”的值。

虽然可爱的Chrome非常满意:

//Hiding all options
            $("#ddlReasonCode").children().hide();
            //Showing only the relevant options
            $("#ddlReasonCode").children("option[atttype=\"" + CurrentType + "\"]").show();

这就是IE所需要的(孩子们,请不要在CHROME上尝试:-)):

//Hiding all options
            $("#ddlReasonCode option").each(function (index, val) {
                if ($(this).is('option') && (!$(this).parent().is('span')) && ($(this).atttype != CurrentType))
                    $(this).wrap('<span>').hide();
            });
            //Showing only the relevant options
            $("#ddlReasonCode option").each(function (index, val) {
                if (this.nodeName.toUpperCase() === 'OPTION') {
                    var span = $(this).parent();
                    var opt = this;
                    if ($(this).parent().is('span') && ((this).atttype == CurrentType)) {
                        $(opt).show();
                        $(span).replaceWith(opt);
                    }
                }
            });

我在http://ajax911.com/hide-options-selecbox-jquery/找到了这种包装方法


3

经过测试,上面提到的各种解决方案(包括混乱)都可以在最新版本的Firefox(66.0.4),Chrome(74.0.3729.169)和Edge(42.17134.1.0)中使用,以隐藏元素。

$("#edit-field-service-sub-cat-value option[value=" + title + "]").hide();
$("#edit-field-service-sub-cat-value option[value=" + title + "]").show();

对于IE,这不起作用,但是您可以禁用该选项

$("#edit-field-service-sub-cat-value option[value=" + title + "]").attr("disabled", "disabled");
$("#edit-field-service-sub-cat-value option[value=" + title + "]").removeAttr("disabled");

然后强制选择其他值。

$("#edit-field-service-sub-cat-value").val("0");

请注意,对于禁用的选项,下拉菜单的val现在将为null,而不是所选选项的值(如果已禁用)。


2

看来您还必须更新“选定”属性。否则,当前选择的选项可能会继续显示-尽管当您实际选择一个选项时,它可能会消失(这就是它为我所做的事情):尝试执行以下操作:

$('#mySelector').children('option').hide();
$('#mySelector').children('option').removeAttr("selected"); //this may be overkill.
$('#mySelector').children('option[value="'+SelVal+'"]').show();  
$('#mySelector').children(':visible').attr('selected','selected'); //assuming that something is still on the list.

2

我试图根据另一个选择列表中的所选选项隐藏一个选择列表中的选项。它可以在Firefox3中运行,但不能在Internet Explorer 6中运行。我在这里有了一些想法,现在有了解决方案,所以我想分享一下:

JavaScript代码

function change_fruit(seldd) {
    var look_for_id=''; var opt_id='';
    $('#obj_id').html("");
    $("#obj_id").append("<option value='0'>-Select Fruit-</option>");
    if(seldd.value=='0') {
        look_for_id='N';
    }
    if(seldd.value=='1'){
        look_for_id='Y';
        opt_id='a';
    }
    if(seldd.value=='2') {
        look_for_id='Y';
        opt_id='b';
    }
    if(seldd.value=='3') {
        look_for_id='Y';
        opt_id='c';
    }

    if(look_for_id=='Y') {
        $("#obj_id_all option[id='"+opt_id+"']").each(function() {
          $("#obj_id").append("<option value='"+$(this).val()+"'>"+$(this).text()+"</option>");
        });
    }
    else {
        $("#obj_id_all option").each(function() {
          $("#obj_id").append("<option value='"+$(this).val()+"'>"+$(this).text()+"</option>");
        });
    }
}

HTML

<select name="obj_id" id="obj_id">
    <option value="0">-Select Fruit-</option>
    <option value="1" id="a">apple1</option>
    <option value="2" id="a">apple2</option>
    <option value="3" id="a">apple3</option>
    <option value="4" id="b">banana1</option>
    <option value="5" id="b">banana2</option>
    <option value="6" id="b">banana3</option>
    <option value="7" id="c">Clove1</option>
    <option value="8" id="c">Clove2</option>
    <option value="9" id="c">Clove3</option>
</select>

<select name="fruit_type" id="srv_type" onchange="change_fruit(this)">
    <option value="0">All</option>
    <option value="1">Starts with A</option>
    <option value="2">Starts with B</option>
    <option value="3">Starts with C</option>
</select>

<select name="obj_id_all" id="obj_id_all" style="display:none;">
    <option value="1" id="a">apple1</option>
    <option value="2" id="a">apple2</option>
    <option value="3" id="a">apple3</option>
    <option value="4" id="b">banana1</option>
    <option value="5" id="b">banana2</option>
    <option value="6" id="b">banana3</option>
    <option value="7" id="c">Clove1</option>
    <option value="8" id="c">Clove2</option>
    <option value="9" id="c">Clove3</option>
</select>

它被检查为可以在Firefox 3和Internet Explorer 6中正常工作。


5
根据W3C,id属性应该是唯一的:id =该属性为元素分配名称。此名称在文档中必须唯一。
贾斯珀(Jasper)2012年

1

为了避免字符串串联,可以使用jQuery.grep

$($.grep($("#edit-field-service-sub-cat-value option"),
         function(n,i){
           return n.value==title;
         })
 ).hide()

1

可能不像jquery插件那样优雅或可重用。但是另一种方法是简单地保存选项元素并根据需要将它们换出:

var SelectFilter = function ()
        {
            this.allOptions = $("#someSelect option");

            this.fooBarOptions= $("#someSelect option[value='foo']");
            this.fooBarOptions= this.fooBarOptions.add($("#someSelect option[value='bar']"));


            this.showFooBarOptions = function()
            {
                $("#someSelect option").remove();
                $("#someSelect").append(this.fooBarOptions);
            };
            this.showAllOptions = function()
            {
                $("#someSelect option").remove();
                $("#someSelect").append(this.allOptions);
            };



        };

为此使用对象:

var filterObject = new SelectFilter();
filterObject.showFooBarOptions (); 

1

我使用一个<select>基于自定义数据属性过滤组合框()的函数实现了解决方案。该解决方案支持:

  • 有一个 <option>显示当过滤器将离开选择空。
  • 尊重现有的选定属性。
  • <option> 没有data-filter属性的元素保持不变。

经过jQuery 2.1.4和Firefox,Chrome,Safari和IE 10+的测试。

这是示例HTML:

<select id="myCombobox">
  <option data-filter="1" value="AAA">Option 1</option>
  <option data-filter="1" value="BBB">Option 2</option>
  <option data-filter="2" value="CCC">Option 3</option>
  <option data-filter="2" value="DDD">Option 4</option>
  <option data-filter="3" value="EEE">Option 5</option>
  <option data-filter="3" value="FFF">Option 6</option>
  <option data-filter-emptyvalue disabled>No Options</option>
</select>

用于过滤的jQuery代码:

function filterCombobox(selectObject, filterValue, autoSelect) {

  var fullData = selectObject.data("filterdata-values");
  var emptyValue = selectObject.data("filterdata-emptyvalue");

  // Initialize if first time.
  if (!fullData) {
    fullData = selectObject.find("option[data-filter]").detach();
    selectObject.data("filterdata-values", fullData);
    emptyValue = selectObject.find("option[data-filter-emptyvalue]").detach();
    selectObject.data("filterdata-emptyvalue", emptyValue);
    selectObject.addClass("filtered");
  }
  else {
    // Remove elements from DOM
    selectObject.find("option[data-filter]").remove();
    selectObject.find("option[data-filter-emptyvalue]").remove();
  }

  // Get filtered elements.
  var toEnable = fullData.filter("option[data-filter][data-filter='" + filterValue + "']");

  // Attach elements to DOM
  selectObject.append(toEnable);

  // If toEnable is empty, show empty option.
  if (toEnable.length == 0) {
    selectObject.append(emptyValue);
  }

  // Select First Occurrence
  if (autoSelect) {
    var obj = selectObject.find("option[selected]");
    selectObject.val(obj.length == 0 ? toEnable.val() : obj.val());
  }
}

要使用它,只需使用要保留的值调用该函数。

filterCombobox($("#myCombobox"), 2, true);

然后,结果选择将是:

<select id="myCombobox">
  <option data-filter="2" value="CCC">Option 3</option>
  <option data-filter="2" value="DDD">Option 4</option>
</select>

原始元素由data()函数存储,因此后续调用将添加和删除正确的元素。


这是一个很好的可重用解决方案,这是我发现的唯一可在Safari上运行的解决方案。谢谢!
Echilon'2



0
$("option_you_want_to_hide").addClass('hidden')

然后,在您的CSS中确保您有

.hidden{
    display:none;
}

0

我知道这个问题已经回答。但是我的要求略有不同。我想按文字过滤而不是值。所以我像这样修改了@William Herry的答案。

var array = ['Administration', 'Finance', 'HR', 'IT', 'Marketing', 'Materials', 'Reception', 'Support'];
if (somecondition) {
   $(array).each(function () {
       $("div#deprtmnts option:contains(" + this + ")").unwrap();
   });
}
else{
   $(array).each(function () {
       $("div#deprtmnts option:contains(" + this + ")").wrap('<span/>');
   });
}

这样,您还可以通过替换这样的包含来使用价值

 $("div#ovrcateg option[value=" + this + "]").wrap('<span/>');

0

对于隐藏的选项选择使用:

option_node.hidden = true; # For hide selcet item
option_node.hidden = false; # For show selcet item

其中option_nodeHTMLOptionElement

PS:我不使用JQuery,但是猜测它会起作用:

$('.my_select option[value="my_cool_value"]').hidden = true

IE不支持在选择选项上隐藏
RitchieD

stackoverflow.com/questions/2031740/…PS:IE 不是浏览器。IE-下载浏览器程序!:)
DAVIDhaker '16

0

我发现最好完全删除DOM。

$(".form-group #selectId option[value='39']").remove();

跨浏览器兼容。也可以在IE11上使用


0
 $('#id').val($('#id option:eq(0)').hide());

option:eq(0)-隐藏选择框中索引“ 0”的选项。



-1

$(“#ddtypeoftraining选项[value = 5]”)。css(“ display”,“ none”); $('#ddtypeoftraining')。selectpicker('refresh');


请在您的解决方案中添加说明!
菲利普M
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.