Ukryj opcje na liście wyboru za pomocą jQuery


98

Mam obiekt z parami klucz / wartość opcji, które chcę ukryć / usunąć z listy wyboru. Żaden z poniższych selektorów opcji nie działa. czego mi brakuje?

$.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
czy na pewno zaakceptowana odpowiedź działa x-browser;) Nienawidziłbym nikogo, kto szukałby tego pytania i odpowiedzi przez Google i odszedł z niewłaściwym wrażeniem!
redsquare

@redsquare - właśnie dlatego zamieściłem link do innego pytania o ukrywanie elementów opcji w zaznaczeniu, które nie jest między przeglądarkami :)
Russ Cam


Odkryłem, że musisz również odznaczyć wybrany element, jeśli jest ukryty po wywołaniu funkcji hide () w Chrome 57.0
omarjebari

Odpowiedzi:


127

Ale warto, druga forma (z @) nie istnieje w jQuery 1.3. Pierwsza nie działa, ponieważ najwyraźniej spodziewasz się interpolacji zmiennej. Spróbuj tego:

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

Zauważ, że prawdopodobnie nastąpi to na różne okropne sposoby, jeśli titlezawiera metaznaki selektora jQuery.


50
Ukrywanie opcji nie jest kompatybilne z różnymi przeglądarkami.
mpen

1
Umieszczanie pojedynczych cudzysłowów rozwiązuje większość problemów związanych z metaznakami jQuery
Peterjwest


Ta koncepcja pomogła mi w znalezieniu innego rozwiązania. Dzięki
Ajay Kumar,

Przez zmęczenie podczas ukrywania <options /> tak często, nie zaktualizuje to wybranej wartości. Musisz wybrać nową opcję po jej ukryciu. Jeśli pracujesz w optgroup, przechodzenie przez DOM jest trudne.
Solvitieg

80

Nie możesz tego zrobić x-browser. Jeśli sobie przypominam, to znaczy, że ma problemy. Najłatwiejszą rzeczą do zrobienia jest zachowanie sklonowanej kopii zaznaczenia przed usunięciem elementów, co pozwala na łatwe usunięcie, a następnie dodanie brakujących elementów.


2
odzyskanie opcji nie będzie problemem, ponieważ jest to część zależnego menu rozwijanego z wywołaniami AJAX do serwera w celu zaktualizowania opcji za każdym razem, gdy zmiana zostanie zmieniona. Ale czy to przypadek hide () nie działający w IE?
hitfactory

Rzeczywiście, ie nie będzie ich ukrywać. Nie jestem pewien co do ie8, ale z pewnością jeden ze smaków ie nie działa
redsquare

Przykład linku
wklejanego

5
Oto odpowiedź, która działa w różnych przeglądarkach - z przykładem tutaj - testowałem w IE6-9, Chrome i FF
Tr1stan

Zobacz moją odpowiedź poniżej, pracującą w IE, FF, Chrome i Safari. Jest to najbardziej elastyczna opcja (dopuszczająca różne wartości z wyświetlanego tekstu).
Sablefoste

53

Znalazłem lepszy sposób i jest to bardzo proste:

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

Aby wyświetlić ponownie, po prostu znajdź tę opcję (nie zakres) i $("option_you_want_to_show").unwrap().

Został przetestowany na Chrome i Firefox.


3
Jesteś absolutnym geniuszem! Tylko jeden wiersz w różnych przeglądarkach.
manudea

Chłodny. Całkiem dobrze radzi sobie z problemem między przeglądarkami.
Subrat Pattnaik

Głosowałem za tym, ale psuje, jeśli nie jest prawidłowo zaimplementowany: na przykład nie możesz użyć $("select").val("0").trigger("change"). Łatwiejszym rozwiązaniem jest to
clod986

2
Tracisz zbyt dużą kontrolę podczas zawijania / rozwijania. łatwo jest przypadkowo rozpakować elementy, które nie zostały jeszcze opakowane, usuwając je z elementu nadrzędnego. Może również zepsuć selektory css. Używanie show / hide jest lepsze, chociaż nadal musisz pamiętać o odznaczeniu dowolnego wybranego elementu za pomocą: $ ('selector-for-dropdown'). Val ('');
omarjebari

1
Podobało mi się rozwiązanie wrap / uwnrap. Trzeba tylko upewnić się, że nie zawijamy podwójnie tych, które są już zapakowane. Podobny pomysł z nieopakowanymi.
anon

47

Oto mój spin, prawdopodobnie trochę szybszy dzięki natywnym metodom 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

Działa to w przeglądarce Firefox 3.0, ale nie w MSIE 8 ani w przeglądarce Opera 9.62:

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

Ale raczej ukrywając opcję, można ją po prostu wyłączyć:

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

Pierwsza z dwóch powyższych linii dotyczy przeglądarki Firefox i przekazuje fokus do drugiej opcji (zakładając, że ma wartość = „2”). Jeśli ją pominiemy, opcja jest wyłączona, ale nadal wyświetla opcję „włączony”, zanim ją upuścimy. Dlatego skupiamy się na innej opcji, aby tego uniknąć.


12

MOŻNA to zrobić w przeglądarce; wystarczy programowanie niestandardowe. Proszę zobaczyć moje skrzypce na http://jsfiddle.net/sablefoste/YVMzt/6/ . Został przetestowany pod kątem działania w przeglądarkach Chrome, Firefox, Internet Explorer i Safari.

Krótko mówiąc, mam ukryte pole, #optionstorektóre przechowuje tablicę sekwencyjnie (ponieważ nie można mieć tablic asocjacyjnych w JavaScript). Następnie, gdy zmienisz kategorię, analizuje istniejące opcje (tylko za pierwszym razem) zapisuje je #optionstore, usuwa wszystko i odkłada tylko te powiązane z kategorią.

UWAGA: stworzyłem to, aby umożliwić różne wartości opcji z tekstu wyświetlanego użytkownikowi, więc jest bardzo elastyczny.

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

Czy mógłbyś wyjaśnić użycie zmiennej resultgood? Usunęliśmy jego użycie, ponieważ gdy użytkownik ma przefiltrowaną listę i wpisuje znak, który oznacza, że ​​nie ma żadnych elementów do wyświetlenia, pusta lista nie jest w rzeczywistości wyświetlana - kod nadal wyświetla elementy, które pasowały do ​​wyszukiwanego terminu bez dodatkowy charakter. Nasz przypadek użycia różni się nieco od przykładu - używamy pola wejściowego, aby zaakceptować wpis wyszukiwanego terminu.
B5A7

Jest resultgoodto po prostu sprawdzenie, czy jakikolwiek optionlistingzostał dodany. jeśli tak było, <option>zwracana jest lista s. Jeśli nie, nic nie jest zwracane, co byś chciał, gdybyś przypadkowo dołączył klasę, której w rzeczywistości nie było (w tym przykładzie, powiedzmy, pod-Food6). Aby zwrócić puste miejsce na liście rozwijanej, zmień wiersz deklaracji na początku funkcji na var optionlisting="<option value=''></option>";.
Sablefoste

Swoją drogą, gdybym miał dziś to pisać, prawdopodobnie nie użyłbym klasy jako nośnika informacji, a raczej dataatrybutu; jest bardziej poprawna semantycznie.
Sablefoste

Tak. Zrobiliśmy to samo.
B5A7

5

Najlepszym rozwiązaniem jest ustawienie disabled = true na elementach opcji, które chcesz wyłączyć, a następnie w ustawieniu CSS

option:disabled {
    display: none;
}

W ten sposób, nawet jeśli przeglądarka nie obsługuje ukrywania wyłączonego elementu, nadal nie można go wybrać… ale w przeglądarkach, które go obsługują, będą ukryte.


4

Spójrz na to pytanie i odpowiedzi -

Wyłącz wybrane opcje ...

Patrząc na swój kod, może być konieczne zacytowanie wartości atrybutu

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

z selektorów atrybutów jQuery

W większości przypadków cudzysłowy są opcjonalne, ale należy ich używać, aby uniknąć konfliktów, gdy wartość zawiera znaki takie jak „]”

EDYTOWAĆ:

Właśnie zdałem sobie sprawę, że otrzymujesz tytuł z parametru funkcji, w takim przypadku składnia powinna być

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

4

W nawiązaniu do sugestii redsquare, skończyłem tak:

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

a potem odwrócić to:

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

3

Problem polega na tym, że program Internet Explorer nie wydaje się obsługiwać metod ukrywania i pokazywania wybranych opcji. Chciałem ukryć wszystkie opcje mojego wyboru ddlReasonCode, które nie miały aktualnie wybranego typu jako wartości atrybutu „attType”.

Podczas gdy piękny Chrome był całkiem zadowolony z:

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

Tego właśnie wymaga IE (dzieci, nie próbuj tego w 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);
                    }
                }
            });

Znalazłem ten pomysł na opakowanie na http://ajax911.com/hide-options-selecbox-jquery/


3

Po przetestowaniu rozwiązania opublikowane powyżej przez różne, w tym chaos, do ukrywania elementów, działają teraz w najnowszych wersjach Firefoksa (66.0.4), Chrome (74.0.3729.169) i 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();

W przypadku IE to nie działa, jednak możesz wyłączyć tę opcję

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

a następnie wymuś wybór innej wartości.

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

Uwaga: w przypadku wyłączonej opcji wartość z listy rozwijanej będzie teraz równa zeru, a nie wartość wybranej opcji, jeśli jest wyłączona.


2

Wygląda na to, że musisz również zaktualizować atrybut „selected”. W przeciwnym razie aktualnie wybrana opcja może nadal być wyświetlana - chociaż prawdopodobnie zniknie, gdy faktycznie przejdziesz do wyboru opcji (to właśnie zrobiła dla mnie): Spróbuj to zrobić:

$('#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

Próbowałem ukryć opcje z jednej listy wyboru na podstawie wybranej opcji z innej listy wyboru. To działało w Firefoksie3, ale nie w Internet Explorerze 6. Mam tutaj kilka pomysłów i mam rozwiązanie, więc chciałbym się podzielić:

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

Został sprawdzony jako działający w przeglądarkach Firefox 3 i Internet Explorer 6.


5
Według W3Cid atrybutu powinna być unikalna: Dichlorowodorek tego atrybutu ustawia nazwę elementu. Ta nazwa musi być unikalna w dokumencie.
Jasper

1

Aby uniknąć łączenia ciągów znaków, możesz użyć jQuery.grep

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

1

Prawdopodobnie nie jest tak elegancki ani tak wielokrotnego użytku jak wtyczka jquery. ale innym podejściem jest po prostu zapisanie elementów opcji i zamiana ich w razie potrzeby:

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



        };

zrób to, aby użyć obiektu:

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

1

Zaimplementowałem rozwiązanie wykorzystujące funkcję filtrującą combobox ( <select>) na podstawie niestandardowych atrybutów danych. To rozwiązanie obsługuje:

  • Mając <option>do pokazania, kiedy filtr pozostawiłby pole wyboru puste.
  • Respektuje istniejące wybrane atrybuty.
  • <option> elementy bez atrybutu filtru danych pozostają nietknięte.

Testowane z jQuery 2.1.4 i Firefox, Chrome, Safari i IE 10+.

Oto przykładowy kod 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>

Kod jQuery do filtrowania:

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

Aby go użyć, po prostu wywołaj funkcję z wartością, którą chcesz zachować.

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

Następnie wynikowy wybór będzie:

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

Oryginalne elementy są przechowywane przez funkcję data (), więc kolejne wywołania będą dodawać i usuwać prawidłowe elementy.


To świetne rozwiązanie wielokrotnego użytku, jedyne, które znalazłem, które działa w Safari. Dzięki!
Echilon


0

Każdy, kto natknie się na to pytanie, może również rozważyć użycie Chosen , który znacznie rozszerza możliwości selekcji.


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

Następnie w swoim css upewnij się, że masz

.hidden{
    display:none;
}

0

Wiem, że udzielono odpowiedzi na to pytanie. Ale moje wymagania były nieco inne. Zamiast wartości chciałem filtrować według tekstu. Więc zmodyfikowałem odpowiedź autorstwa @William Herry w ten sposób.

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

W ten sposób możesz użyć wartości również zastępując takie elementy

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

0

W przypadku opcji ukrywania w wybierz użyj:

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

Gdzie option_node jest HTMLOptionElement

PS: Nie używam JQuery, ale zgaduję, że zadziała:

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

IE nie obsługuje funkcji ukrywania wybranych opcji
RitchieD

stackoverflow.com/questions/2031740/… PS: IE nie jest przeglądarką. IE - program do przeglądarki pobierania! :)
DAVIDhaker

0

Uważam, że najlepiej jest po prostu całkowicie usunąć DOM.

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

Zgodność z różnymi przeglądarkami. Działa również na IE11


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

opcja: eq (0) - ukryj opcję pod indeksem „0” w polu wyboru.



-1

$ ("# ddtypeoftraining opcja [wartość = 5]"). css ("display", "none"); $ ('# ddtypeoftraining'). selectpicker ('odśwież');


Dodaj opis do swojego rozwiązania!
Philipp M
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.