Скрыть опции в списке выбора с помощью jQuery
У меня есть объект с парами ключ/значение параметров, я хочу, чтобы скрыть/удалить из списка выбора. Ни один из следующих селекторов параметров не работает. Чего мне не хватает?
$.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();
});
22 ответа:
для чего это стоит, вторая форма (с
@
) не существует в jQuery 1.3. Первый не работает, потому что вы, по-видимому, ожидаете переменной интерполяции. Попробуйте это:$("#edit-field-service-sub-cat-value option[value=" + title + "]").hide();
обратите внимание, что это, вероятно, сломается различными отвратительными способами, если
title
содержит метасимволы селектора jQuery.
вы не можете сделать это x-браузер. Если я помню, у ie есть проблемы. Самое простое, что нужно сделать, это сохранить клонированную копию select перед удалением элементов, это позволяет легко удалить, а затем добавить отсутствующие элементы обратно.
Я нашел лучший способ, и это очень просто:
$("option_you_want_to_hide").wrap('<span/>')
чтобы показать снова, просто найдите эту опцию (не span) и
$("option_you_want_to_show").unwrap()
.Он был протестирован на Chrome и Firefox.
вот мой спин, вероятно, немного быстрее из-за родных методов 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(); } }); });
это может быть сделано кросс-браузер; это просто занимает некоторое пользовательское Программирование. Пожалуйста, смотрите мою скрипку на 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; } }
это работает в 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-й вариант (предполагая, что он имеет значение="2"). Если мы опустим его, опция отключена, но по-прежнему отображается опция "включено", прежде чем мы ее опустим. Поэтому мы переходим к другому варианту, чтобы избежать этого.
взгляните на этот вопрос и ответы -
глядя на ваш код, вам может потребоваться указать значение атрибута
$("#edit-field-service-sub-cat-value option[value='title']").hide();
кавычки в большинстве случаев необязательны, но следует использовать, чтобы избежать конфликтов, когда значение содержит символы типа"]"
EDIT:
просто понял, что вы получаете название от параметра функции, и в этом случае синтаксис должен быть
$("#edit-field-service-sub-cat-value option[value='" + title + "']").hide();
в отношении предложения redsquare, я закончил тем, что сделал это:
var selectItems = $("#edit-field-service-sub-cat-value option[value=" + title + "]").detach();
и затем повернуть вспять этот:
$("#edit-field-service-sub-cat-value").append(selectItems);
лучше всего установить disabled=true на элементах опций, которые вы хотите отключить, а затем в CSS set
option:disabled { display: none; }
таким образом, даже если браузер не поддерживает скрытие пункт отключен, он все равно не может быть выбран.. но в браузерах это do поддерживают его, они будут скрыты.
проблема в том, что Internet Explorer, похоже, не поддерживает методы скрытия и отображения для выбранных параметров. Я хотел скрыть все параметры моего выбора ddlReasonCode, которые не имели выбранного в данный момент типа в качестве значения атрибута "attType".
в то время как прекрасный хром был вполне доволен:
//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/
похоже, что вам также нужно обновить атрибут "selected". В противном случае выбранный в данный момент параметр может продолжать отображаться - хотя он, вероятно, исчезнет, когда вы на самом деле перейдете к выбору опции (вот что он сделал для меня): Попробуйте сделать это:
$('#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.
Я пытался скрыть параметры из одного списка выбора на основе выбранного параметра из другого списка выбора. Он работал в 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.
чтобы избежать конкатенации строк, вы можете использовать jQuery.грэп
$($.grep($("#edit-field-service-sub-cat-value option"), function(n,i){ return n.value==title; }) ).hide()
вероятно, не так элегантно или многоразово, как плагин 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 ();
я реализовал решение с помощью функции, которая фильтрует combobox (
<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 (), поэтому последующие вызовы будут добавлять и удалять правильные элементы.
ответ указывает на то, что
@
является недопустимым для новой итерации с помощью jQuery. Хотя это правильно, некоторые старые IEs все еще не скрывают элементы опции. Для тех, кому приходится иметь дело с элементами скрытия опций в этих затронутых версиях, я опубликовал обходной путь здесь:http://work.arounds.org/issue/96/option-elements-do-not-hide-in-IE/
в основном просто оберните его с промежутком и замените на шоу.
любой, кто натыкается на этот вопрос, может также рассмотреть использование выбрал, что значительно расширяет возможности выбор.
$("option_you_want_to_hide").addClass('hidden')
затем, в вашем css убедитесь, что у вас есть
.hidden{ display:none; }
Я знаю, что на этот вопрос был дан ответ. Но мое требование было несколько иным. Вместо значения я хотел фильтровать по тексту. Поэтому я изменил ответ @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/>');
скрыть опции на выберите использование:
option_node.hidden = true; # For hide selcet item option_node.hidden = false; # For show selcet item
здесь option_node и HTMLOptionElement
П. С.: Я не использую jQuery, но предполагаю, что это будет работать:
$('.my_select option[value="my_cool_value"]').hidden = true