Cacher des options dans une liste de sélection en utilisant jQuery

j'ai un objet avec des paires clé/valeur d'options que je veux cacher/supprimer d'une liste de sélection. Aucun des sélecteurs d'options suivants ne fonctionne. Ce qui me manque?

$.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();
}); 
93
demandé sur Kara 2009-08-13 15:49:43

22 réponses

pour ce que ça vaut, la seconde forme (avec le @ ) n'existe pas dans jQuery 1.3. La première ne fonctionne pas parce que vous vous attendez apparemment à une interpolation variable. Essayez ceci:

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

notez que cela se cassera probablement de diverses manières hideuses si title contient des métacaractères de sélection jQuery.

108
répondu chaos 2009-08-13 11:55:55

vous ne pouvez pas faire ce X-browser. Si je me souviens bien, ie a des problèmes. La chose la plus facile à faire est de conserver une copie clonée du select avant de supprimer des éléments, ce qui vous permet de supprimer facilement et puis d'ajouter les éléments manquants.

80
répondu redsquare 2009-08-13 12:11:26

j'ai trouvé une meilleure façon, et c'est très simple:

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

Pour montrer de nouveau, il suffit de trouver cette option(pas de durée) et $("option_you_want_to_show").unwrap() .

il a été testé sur Chrome et Firefox.

48
répondu William Herry 2014-03-22 21:52:43

Voici mon spin, probablement un peu plus rapide en raison des méthodes DOM natives

$.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();
      }
    });
});
47
répondu Caprica Six 2012-11-20 17:13:25

Il PEUT être fait de la croix-navigateur; il faut juste un peu de programmation personnalisée. S'il vous plaît voir mon violon à http://jsfiddle.net/sablefoste/YVMzt/6 / . Il a été testé pour fonctionner dans Chrome, Firefox, Internet Explorer et Safari.

en bref, j'ai un champ caché, #optionstore , qui stocke le tableau séquentiellement (puisque vous ne pouvez pas avoir de tableaux associatifs en JavaScript). Ensuite, lorsque vous changez de catégorie, il passe les options existantes (première fois seulement) écrit dans #optionstore , efface tout, et met en arrière que ceux associés à la catégorie.

NOTE: je l'ai créé pour permettre des valeurs d'option différentes du texte affiché à l'utilisateur, il est donc très flexible.

the 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>

the 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;
    }
}
12
répondu Sablefoste 2014-03-22 21:57:54

cela fonctionne dans Firefox 3.0, mais pas dans MSIE 8, ni dans Opera 9.62:

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

mais plutôt cacher une option, on peut simplement la désactiver:

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

la première des deux lignes ci-dessus est pour Firefox et passe focus à la deuxième option (en supposant qu'elle a Valeur="2"). Si nous l'omettons, l'option est désactivée, mais l'option "enabled" s'affiche avant que nous la laissions tomber. Par conséquent, nous passons focus à une autre option pour éviter cela.

11
répondu enthusiastic123 2013-03-28 14:59:19

regardez cette question et les réponses -

désactiver les options de sélection...

en Regardant votre code, vous pouvez avoir besoin de citer la valeur de l'attribut

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

from jQuery attribut selectors

les citations sont optionnelles dans la plupart des cas, mais devrait être utilisé pour éviter les conflits lorsque la valeur contient des caractères comme "]"

EDIT:

vient de réaliser que vous obtenez le titre à partir du paramètre de fonction, auquel cas la syntaxe devrait être

$("#edit-field-service-sub-cat-value option[value='" + title + "']").hide();
4
répondu Russ Cam 2017-05-23 12:26:19

en référence à la suggestion de redsquare, j'ai fini par faire ceci:

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

et ensuite inverser ceci:

$("#edit-field-service-sub-cat-value").append(selectItems);
4
répondu MadTurki 2013-03-26 15:40:02

votre meilleur pari est de définir disabled=true sur les éléments d'option que vous voulez désactiver, puis dans CSS set

option:disabled {
    display: none;
}

de cette façon, même si le navigateur ne supporte pas de cacher l'élément désactivé, il ne peut toujours pas être sélectionné.. mais sur les navigateurs qui do le supportent, ils seront cachés.

3
répondu eoleary 2013-12-11 20:43:26

le problème est Qu'Internet Explorer ne semble pas supporter les méthodes hide and show pour sélectionner des options. Je voulais cacher toutes les options de mon ddlReasonCode sélectionnez qui n'ont pas le type actuellement sélectionné comme valeur de l'attribut "attType".

alors que la belle Chrome était tout à fait satisfait de:

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

C'est ce QU'il faut (les enfants, ne l'essayez pas chez 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);
                    }
                }
            });

j'ai trouvé cette idée d'emballage à http://ajax911.com/hide-options-selecbox-jquery/

3
répondu Oranit Dar 2014-07-31 11:27:08

il semble que vous ayez aussi à mettre à jour l'attribut" selected". Sinon l'option actuellement sélectionnée peut continuer à s'afficher-bien qu'elle disparaîtra probablement lorsque vous allez réellement sélectionner une option (c'est ce qu'elle a fait pour moi): Essayez de faire ceci:

$('#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
répondu djoeberry 2010-11-17 01:23:37

j'essayais de masquer les options d'une liste de sélection selon l'option choisie à partir d'une autre liste de sélection. Il fonctionnait dans Firefox3, mais pas dans Internet Explorer 6. J'ai quelques idées ici et j'ai une solution Maintenant, donc je voudrais partager:

le code 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>");
        });
    }
}

the 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>

il a été vérifié comme travaillant dans Firefox 3 et Internet Explorer 6.

2
répondu Souvik 2014-03-22 22:02:32

pour éviter la concaténation de chaîne, vous pouvez utiliser jQuery.grep

$($.grep($("#edit-field-service-sub-cat-value option"),
         function(n,i){
           return n.value==title;
         })
 ).hide()
1
répondu rretzbach 2012-07-28 08:10:12

probablement pas aussi élégant ou aussi réutilisable qu'un plugin jquery. mais une autre approche consiste simplement à sauvegarder les éléments d'option et à les échanger selon les besoins:

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);
            };



        };

pour utiliser l'objet:

var filterObject = new SelectFilter();
filterObject.showFooBarOptions (); 
1
répondu Squibly 2015-09-16 06:33:26

j'ai implémenté une solution en utilisant une fonction qui filtre un combobox ( <select> ) basée sur des attributs de données personnalisés. Cette solution prend en charge:

  • ayant un <option> pour indiquer quand le filtre quitterait le select vide.
  • respecte les attributs sélectionnés existants.
  • <option> les éléments sans l'attribut data-filter sont laissés intacts.

Testé avec jQuery 2.1.4 et Firefox, Chrome, Safari et IE 10+.

C'est L'exemple 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>

le code jQuery pour le filtrage:

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());
  }
}

pour l'utiliser, vous appelez simplement la fonction avec la valeur que vous voulez garder.

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

puis le select résultant sera:

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

les éléments originaux sont stockés par la fonction data (), ainsi les appels suivants seront ajouter et supprimer les éléments corrects.

1
répondu Alberto Hormazabal 2016-03-04 14:12:51

la réponse indique que @ n'est pas valide pour les itérations jQuery plus récentes. Bien que ce soit exact, certains s plus anciens ne cachent toujours pas les éléments d'option. Pour toute personne ayant à faire avec cacher des éléments d'option dans les versions concernées, j'ai posté un contournement ici:

http://work.arounds.org/issue/96/option-elements-do-not-hide-in-IE /

en gros, il suffit de l'envelopper avec une portée et de remplacer sur le spectacle.

0
répondu meder omuraliev 2011-03-24 15:11:25

quiconque trébuche sur cette question pourrait également envisager l'utilisation de choisi , ce qui élargit considérablement les capacités des sélections.

0
répondu Charles Wood 2014-06-16 21:58:02
$("option_you_want_to_hide").addClass('hidden')

ensuite, dans votre css assurez-vous que vous avez

.hidden{
    display:none;
}
0
répondu clod986 2015-09-26 11:08:48

je sais qu'on a répondu à cette question. Mais mes exigences étaient légèrement différentes. Au lieu de valeur, je voulais filtrer par texte. J'ai donc modifié la réponse de @William Herry comme ceci.

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/>');
   });
}

de cette façon, vous pouvez utiliser la valeur aussi en remplaçant contient comme ceci

 $("div#ovrcateg option[value=" + this + "]").wrap('<span/>');
0
répondu jkjhse 2015-12-13 07:21:18

Pour masquer option dans , sélectionnez utiliser:

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

option_node est HTMLOptionElement

P. S.: Je n'utilise pas JQuery, mais deviner, que c'est la volonté fonctionne:

$('.my_select option[value="my_cool_value"]').hidden = true
0
répondu DAVIDhaker 2016-06-21 14:26:22

j'ai trouvé le meilleur pour enlever le DOM complètement.

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

compatible avec les navigateurs croisés. Fonctionne sur IE11 trop

0
répondu Vishal 2018-06-04 09:22:44

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

option:eq(0)-option masquer à l'index '0' dans la boîte de sélection.

-1
répondu Kiran 2016-08-11 06:30:55