Сховати параметри у списку вибору за допомогою 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 - саме тому я опублікував посилання на інше питання про приховування елементів опцій у вибраному не перехресному браузері :)
Russ Cam


Я виявив, що вам також доведеться скасувати вибір вибраного елемента, якщо він прихований після того, як виклик
hid

Відповіді:


127

Для чого це варто, друга форма (з @) не існує в jQuery 1.3. Перший не працює, оскільки ви, мабуть, очікуєте змінної інтерполяції. Спробуйте це:

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

Зауважте, що це, ймовірно, порушиться різними жахливими способами, якщо titleмістить метахарактори селектора jQuery.


50
Приховування параметрів не сумісне між браузером.
mpen

1
Якщо поставити єдині лапки, вирішите більшість питань, пов'язаних з
метахарактеристиками


Ця концепція допомогла мені для іншого рішення. Спасибі
Аджай Кумар

Втомлюючись, коли ховається <options /> так часто, це звичай не оновлює вибране значення. Вам потрібно буде вибрати новий варіант після його прихованого. Якщо ви працюєте в optgroup, вам непросто об'їхати DOM.
Solvitieg

80

Ви не можете зробити цей x-браузер. Якщо я пригадую, є проблеми. Найпростіше зробити це зберегти клоновану копію вибраного перед тим, як видалити елементи, це дозволяє легко видалити, а потім додати відсутні елементи назад.


2
повернення параметрів не буде проблемою, оскільки воно є частиною залежної спадної частини з ajax-дзвінками на сервер, щоб оновлювати параметри кожного разу при зміні. Але чи це справа про те, що в IE справа не працює ()?
хітфактор

Дійсно тобто не приховуватиме їх. Не впевнений про ie8, але, безумовно, один з т.
Е. Ароматів

Приклад посилання на
пастину

5
Ось відповідь, яка працює між браузером - з прикладом тут - я протестував в IE6-9, Chrome і FF
Tr1stan

Перегляньте мою відповідь нижче, працюючи в IE, FF, Chrome та Safari. Це найбільш гнучка опція (допускає різні значення від відображеного тексту).
Sablefoste

53

Я знайшов кращий спосіб, і це дуже просто:

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

Щоб показати ще раз, просто знайдіть цю опцію (не проміжок) та $("option_you_want_to_show").unwrap().

Він був протестований на Chrome і Firefox.


3
Ви абсолютний геній! Лише один рядок перехрещують магію браузера.
манудея

Класно. Досить добре впорається з проблемою браузера.
Субрат Паттайк

Я схвалив цей, але він псується, якщо не реалізований належним чином: наприклад, ви не можете використовувати $("select").val("0").trigger("change"). Найпростіше рішення це
clod986

2
Ви втрачаєте занадто багато контролю за допомогою обгортання / розгортання. легко випадково розкрутити елементи, які вже не були загорнуті, отже, позбавивши їх батьківського елемента. Також це може зіпсувати селектори CSS. Використовувати показ / приховування краще, хоча вам все-таки потрібно пам’ятати, щоб скасувати виділення будь-якого вибраного елемента також з: $ ('selector-for-dropdown'). Val ('');
omarjebari

1
Мені сподобався розчин для обгортання / зачісування. Просто потрібно переконатися, що ми не подвійно обгортаємо ті, які вже завернуті. Подібна ідея з розгорнутою.
анонім

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 і передає фокус другому варіанту (якщо він має значення = "2"). Якщо ми її опустимо, параметр вимкнено, але все ще відображається варіант "увімкнено", перш ніж ми його скинемо. Отже, ми переходимо до іншого варіанту, щоб цього уникнути.


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

Чи можете ви пояснити використання змінної результуючого товару? Ми видалили його використання, оскільки коли у користувача є відфільтрований список, і користувач вводить символ, який означає, що немає елементів для відображення, порожній список фактично не відображається - код продовжує перераховувати елементи, які відповідають пошуковому терміну без зайвий характер. Наш випадок використання дещо відрізняється від прикладу - ми використовуємо поле введення для прийняття запиту пошукового терміна.
B5A7

Це resultgoodпросто перевірка, щоб побачити, чи optionlistingбуло додано. якщо це було, <option>повертається список s. Якщо ні, нічого не повертається, що ви хотіли б, якби випадково включили клас, якого насправді не було (у цьому прикладі, скажімо, під-їжа6). Щоб повернути пропуск у спадному меню, змініть рядок декларації на початку функції на var optionlisting="<option value=''></option>";.
Sablefoste

До речі, якби я сьогодні писав це, я, мабуть, не використовував би клас як носій інформації, а скоріше dataатрибут; це більш семантично правильно.
Sablefoste

Так. Ми зробили те саме.
B5A7

5

Ваша найкраща ставка - встановити на рівні опцій, які ви хочете відключити, встановити на вимкнено = істина, а потім у наборі CSS

option:disabled {
    display: none;
}

Таким чином, навіть якщо браузер не підтримує приховування відключеного елемента, його все одно неможливо вибрати. Але в браузерах, які підтримують його, вони будуть приховані.


4

Погляньте на це питання та відповіді -

Вимкнути параметри вибору ...

Дивлячись на свій код, вам може знадобитися навести значення атрибута

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

з атрибутів атрибутів jQuery

Котирування в більшості випадків необов’язкові, але їх слід використовувати, щоб уникнути конфліктів, коли значення містить символи типу "]"

Редагувати:

Щойно зрозумів, що ти отримуєш заголовок з параметра функції, і в цьому випадку повинен бути синтаксис

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

4

Посилаючись на пропозицію червоного квадрату, я закінчив це:

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

а потім скасувати це:

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

3

Проблема полягає в тому, що, здається, Internet Explorer не підтримує способи приховування та показу вибору параметрів. Я хотів приховати всі параметри мого вибору ddlReasonCode, у яких не було обраного на даний момент типу значення атрибута "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, що випадає, тепер буде нульовим, а не значенням вибраного параметра, якщо він вимкнено.


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
Згідно W3Cid , атрибут повинен бути унікальним: ID = Цей атрибут присвоює ім'я елемента. Це ім’я повинно бути унікальним у документі.
Джаспер

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> елементи без атрибута фільтра даних залишаються недоторканими.

Тестовано на 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. Дякую!
Ехілон

0

У відповіді вказується, що @він недійсний для новіших ітерацій jQuery. Хоча це правильно, деякі старші IE все ще не приховують елементи опцій. Для всіх, хто має справу з прихованими елементами опцій у цих версіях, я розмістив тут вирішення:

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

По суті, просто оберніть її з прольотом і замініть на виставці.


0

Кожен, хто натикається на це питання, також може розглянути можливість використання Chosen , що значно розширює можливості вибору.


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_node - HTMLOptionElement

PS: Я не використовую JQuery, але здогадуюсь, що це спрацює:

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

IE не підтримує ховати вибрані параметри
RitchieD

stackoverflow.com/questions/2031740/… PS: IE не є браузером. IE - програма для завантаження браузера! :)
DAVIDhaker

0

Я вважав, що найкраще просто видалити DOM повністю.

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

Сумісний веб-переглядач. Працює і на IE11


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

параметр: eq (0) - приховати параметр з індексом '0' у полі вибору.



-1

$ ("# ddtypeoftraining option [value = 5]"). css ("відображення", "немає"); $ ('# ddtypeoftraining'). selectpicker ('оновити');


Будь ласка, додайте опис до свого рішення!
Philipp M
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.