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-browserで機能することを確信していますか;)Googleを通じてこのQ&Aを見つけて、間違った印象で立ち去るのを他の誰かが嫌いです!
redsquare

@redsquare-それがまさに、selectにクロスブラウザではないオプション要素を非表示にすることに関する別の質問へのリンクを投稿した理由です:)
Russ Cam


Chrome 57.0でhide()が呼び出された後に非表示になっている場合も、選択した要素の選択を解除する必要があることを発見しました
omarjebari

回答:


127

それだけの価値があるので、2番目の形式(@)はjQuery 1.3には存在しません。最初は変数補間を期待しているため、機能していません。これを試して:

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

titlejQueryセレクターのメタキャラクターが含まれている場合、これはおそらくさまざまな恐ろしい方法で壊れることに注意してください。


50
オプションの非表示は、ブラウザ間の互換性がありません
mpen '28年

1
単一引用符を置くと、jqueryメタキャラクターのほとんどの問題が解決されます
peterjwest '


このコンセプトは、別の解決策を見つけるのに役立ちました。ありがとう
Ajay Kumar

<options />を非表示にするときにうんざりすると、選択した値が更新されないことがよくあります。非表示にした後、新しいオプションを選択する必要があります。optgroupで作業している場合は、DOMを通過するのが難しくなります。
Solvitieg 2018

80

このx-browserは実行できません。私が思い出した場合、すなわち問題があります。最も簡単な方法は、アイテムを削除する前に、selectのクローンコピーを保持することです。これにより、不足しているアイテムを簡単に削除してから追加し直すことができます。


2
オプションを取得することは、変更のたびにオプションを更新するためのサーバーへのajax呼び出しを伴う依存ドロップダウンの一部であるため、問題にはなりません。しかし、それはIEで機能しないhide()の場合ですか?
ヒットファクトリー2009

確かにieはそれらを隠しません。ie8についてはわかりませんが、ieフレーバーの1つは機能しません
redsquare 2009

ペーストビンリンクの例では、Chromeのオプションも非表示になりません
slolife 09

5
これがクロスブラウザーで機能する回答です - ここに例を示します -IE6-9、Chrome、FFでテストしました
Tr1stan

IE、FF、Chrome、Safariで動作する以下の私の答えを参照してください。これは最も柔軟なオプションです(表示されたテキストとは異なる値を許可します)。
Sablefoste 2012年

53

私はより良い方法を見つけました、そしてそれは非常に簡単です:

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

もう一度表示するには、そのオプション(スパンではない)とを見つけます$("option_you_want_to_show").unwrap()

ChromeとFirefoxでテストされています。


3
あなたは絶対的な天才です!たった一行がブラウザの魔法を越えます。
manudea 2014

涼しい。クロスブラウザーの問題をかなりうまく処理します。
Subrat Pattnaik 2015年

私はこれに賛成しましたが、適切に実装されていないと混乱します$("select").val("0").trigger("change")。たとえば、を使用できません。より簡単な解決策はこれです
clod986 2015

2
ラップ/アンラップを使用して制御を失います。まだラップされていない要素を誤ってラップ解除して、それらの親要素を取り除くのは簡単です。また、CSSセレクターを混乱させる可能性があります。選択した要素の選択を解除することも忘れないでください:$( 'selector-for-dropdown')。val( '');
omarjebari 2017

1
wrap / uwnrapソリューションが気に入りました。既にラップされているものをダブルラップしないようにする必要があります。ラップされていないものと同様のアイデア。
アノン

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

上記の2行のうち最初の行はFirefox用で、フォーカスを2番目のオプションに渡します(value = "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;
    }
}

resultgood変数の使用について説明してもらえますか?ユーザーがフィルターされたリストを持ち、ユーザーが表示するアイテムがないことを意味する文字を入力すると、空のリストは実際には表示されないため、その使用を削除しました。余分な文字。使用例は例とは少し異なります。入力フィールドを使用して、検索語句の入力を受け入れます。
B5A7 2018

これresultgoodは、optionlisting追加されたかどうかを確認するためのチェックです。そうであれば、<option>s のリストが返されます。そうでない場合、何も返されません。これは、実際にはないクラス(この例では、sub-Food6)を誤って含めた場合に必要なものです。ドロップダウンで空白を返すには、関数の先頭の宣言行をに変更しvar optionlisting="<option value=''></option>";ます。
Sablefoste

ちなみに、今日これを書くとしたら、情報担体としてクラスを使用するのではなく、むしろdata属性を使用するでしょう。より意味的に正しいです。
Sablefoste

はい。私たちは同じことをしました。
B5A7 2018

5

あなたの最善の策は、無効にしたいオプション項目にdisabled = trueを設定してから、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

redsquareの提案に関連して、私はこれをやった:

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

そしてこれを逆にする:

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

3

問題は、Internet Explorerが選択オプションの非表示および表示メソッドをサポートしていないように見えることです。「attType」属性の値として現在選択されているタイプを持たないddlReasonCode selectのすべてのオプションを非表示にする必要がありました。

素敵なクロムは非常に満足しましたが:

//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");

無効化されたオプションの場合、ドロップダウンの値はnullになり、無効化されている場合、選択されたオプションの値ではなくなります。


2

「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.

2

別の選択リストから選択したオプションに基づいて、1つの選択リストからオプションを非表示にしようとしていました。これは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
W3Cによると、このid属性は一意である必要があります。id =この属性は、要素に名前を割り当てます。この名前はドキュメント内で一意である必要があります。
Jasper

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> data-filter属性のない要素は変更されません。

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で動作する唯一のソリューションです。ありがとう!
エシロン2017

0

答え@は、新しいjQueryの反復には無効であることを指摘しています。それは正しいですが、一部の古いIEはオプション要素を非表示にしません。影響を受けるバージョンのオプション要素を非表示にする必要がある人のために、ここに回避策を投稿しました:

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

基本的には、スパンでラップしてショーで置き換えます。



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_nodeHTMLOptionElementです。

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

option:eq(0)-選択ボックスのインデックス '0'にあるオプションを非表示にします。



-1

$( "#ddtypeoftraining option [value = 5]")。css( "display"、 "none"); $( '#ddtypeoftraining')。selectpicker( 'refresh');


ソリューションに説明を追加してください!
Philipp M
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.