選択リストから非表示/削除したいオプションのキー/値ペアを持つオブジェクトがあります。次のオプションセレクタはどちらも機能しません。私は何が欠けていますか?
$.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();
});
価値があるのは、jQuery 1.3には2番目のフォーム(@
を含む)は存在しません。あなたは明らかに変数補間を期待しているので、最初のものは機能していません。これを試して:
$("#edit-field-service-sub-cat-value option[value=" + title + "]").hide();
title
にjQueryセレクターメタキャラクターが含まれている場合、これはおそらくさまざまな恐ろしい方法で破損することに注意してください。
このxブラウザは実行できません。すなわち、問題がある場合を思い出してください。最も簡単な方法は、アイテムを削除する前に選択のクローンコピーを保持することです。これにより、不足しているアイテムを簡単に削除してから追加できます。
私はより良い方法を見つけましたが、それは非常に簡単です:
$("option_you_want_to_hide").wrap('<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');
上記の2行のうち最初の行はFirefox用であり、2番目のオプションにフォーカスを渡します(value = "2"であると仮定)。省略した場合、オプションは無効になりますが、ドロップダウンする前に「有効」オプションが表示されます。したがって、これを避けるために別のオプションにフォーカスを渡します。
Redsquareの提案を参照して、私はこれをやった:
var selectItems = $("#edit-field-service-sub-cat-value option[value=" + title + "]").detach();
そしてこれを逆にする:
$("#edit-field-service-sub-cat-value").append(selectItems);
最善の策は、無効にするオプション項目にdisabled = trueを設定してから、CSSセットに設定することです。
option:disabled {
display: none;
}
そのようにすると、ブラウザが無効なアイテムの非表示をサポートしていなくても選択できません。doをサポートするブラウザでは、非表示になります。
この質問と答えを見てください-
コードを見て、属性値を引用する必要があるかもしれません
$("#edit-field-service-sub-cat-value option[value='title']").hide();
from jQuery属性セレクター
ほとんどの場合、引用符はオプションですが、値に「]」などの文字が含まれる場合の競合を避けるために使用する必要があります
編集:
関数パラメーターからタイトルを取得していることに気付きました。この場合、構文は次のようになります。
$("#edit-field-service-sub-cat-value option[value='" + title + "']").hide();
問題は、Internet Explorerが選択オプションの非表示および表示メソッドをサポートしていないように見えることです。属性「attType」の値として現在選択されているタイプを持たないddlReasonCode selectのすべてのオプションを非表示にしたかった。
素敵な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/ でそのラッピングアイデアを見つけました
別の選択リストから選択したオプションに基づいて、ある選択リストからオプションを非表示にしようとしていました。 Firefox3で機能していましたが、Internet Explorer 6では機能していませんでした。
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>");
});
}
}
<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で動作していることが確認されました。
テスト後、要素を非表示にするために、カオスを含むさまざまな方法で投稿されたソリューションは、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");
無効なオプションの場合、ドロップダウンの値は無効になり、選択されたオプションの値ではなくnullになります。
「選択済み」属性も更新する必要があるようです。そうしないと、現在選択されているオプションが表示され続ける可能性があります-実際にオプションを選択するときに消える可能性があります(それは私のためにしたことです):これを試してください:
$('#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.
文字列の連結を回避するには、 jQuery.grep を使用できます
$($.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 ();
カスタムデータ属性に基づいてコンボボックス(<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()関数によって保存されるため、以降の呼び出しでは正しい要素を追加および削除します。
Hide option in selectの場合:
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
DOMを完全に削除することをお勧めします。
$(".form-group #selectId option[value='39']").remove();
クロスブラウザ互換。 IE11でも動作します
$("option_you_want_to_hide").addClass('hidden')
次に、CSSで次のことを確認します
.hidden{
display:none;
}
答えは、@
が新しいjQuery反復に対して無効であることを指摘しています。それは正しいですが、一部の古いIEはまだオプション要素を隠していません。影響を受けるバージョンでオプション要素を非表示にする必要がある場合は、ここに回避策を投稿しました。
http://work.arounds.org/issue/96/option-elements-do-not-hide-in-IE/
基本的には、スパンでラップし、ショーで置き換えます。
私はこの質問に答えられたことを知っています。しかし、私の要件はわずかに異なっていました。値の代わりに、テキストでフィルタリングしたかった。そこで、@ 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/>');
この問題に出くわした人は、 Chosen の使用を検討することもできます。これにより、selectの機能が大幅に拡張されます。