CSSで<select>メニューの<option>を非表示にする方法は?


103

私はクロームが、それはそう、私は非表示にすることができないことを実現しました<option><select>。Firefoxはそうします。

<option>検索条件に一致するを非表示にする必要があります。Chromeウェブツールではdisplay: none;、JavaScriptによって正しく設定されていることがわかり<select>ますが、メニューをクリックすると表示されます。

<option>メニューをクリックしたときに、検索条件に一致するを表示しないようにするにはどうすればよいですか?ありがとう!


4
検索で非表示にして表示する代わりに。検索に応じて、selectを入力してください
Henesnarfel

1
私はヘネスナーフェルに同意します。すでに検索または何らかのクエリを実行している場合は、必要なものだけを入力できます。
Michael Stramel

1
これはChrome 16.0.912.77 mでは正常に機能します。私は問題を誤解していますか?
mgibsonbr

3
@mgibsonbrクロスブラウザでは機能しません。
ジャスパー

3
@Henesnarfelオプションを非表示にする理由はいくつかあります。たとえば、選択リストボックスと非アクティブとしてマークされたアイテムを非表示または表示するためのリンクを備えたページがありました。ユーザーがオプションを変更するたびに、複数のリストを保持したり、サーバーに新しいリストを問い合わせたりする理由はありません。
ライアンP

回答:


69

非表示にするには、2つのメソッドを実装する必要があります。display: noneFFでは動作しますが、ChromeやIEでは動作しません。だから第二の方法は、ラップしている<option><span>してdisplay: none。FFはそれを行いません(技術的にはHTMLは仕様上無効です)が、ChromeとIEはそうし、オプションを非表示にします。

編集:そうそう、私はすでにこれをjQueryに実装しました:

jQuery.fn.toggleOption = function( show ) {
    jQuery( this ).toggle( show );
    if( show ) {
        if( jQuery( this ).parent( 'span.toggleOption' ).length )
            jQuery( this ).unwrap( );
    } else {
        if( jQuery( this ).parent( 'span.toggleOption' ).length == 0 )
            jQuery( this ).wrap( '<span class="toggleOption" style="display: none;" />' );
    }
};

編集2:この関数の使用方法は次のとおりです。

jQuery(selector).toggleOption(true); // show option
jQuery(selector).toggleOption(false); // hide option

編集3:@ user1521986によって提案された追加のチェックを追加


1
このクレイジーな方法は、実際に完全にクロスブラウザーで機能し、偽装された選択ボックスハックの作成を必要としない唯一の方法です。
ジェシーアトキンソン

15
これに注意してください。最初はうまく機能しているようですが、途中で停止します。これが小さなデモです:jsfiddle.net/Yb6sk/9
ビルクリスウェル

17
このソリューションは要素を非表示にしますが、<select>(jQueryを使用して.val())の値を読み取ろうとすると、が返されnullます。私はこれをChrome 29でテストしたばかりなので、Google社員は注意が必要です。
マーク

10
興味深いハックですが、可能であれば「技術的に無効なHTML」を回避することをお勧めします。
ルーク

3
確かに、すべてのブラウザーには異なる実装があります。しかし、ブラウザが標準仕様を厳密に実装できない理由の1つは、仕様に従っていないライブコードが多すぎるためです。IMO:他に解決策がない場合は、必ずハックを使用してください。しかし、仕様に従って問題解決できたら、どうしてでしょうか?それはあなたのコードが他の人とうまく遊ぶのを助け、仕様を強化するのを助けます。
ルーク

82

HTML5では、 'hidden'属性を使用できます。

<option hidden>Hidden option</option>

それはされていない IE <11でサポートされているしかし、あなたはいくつかの要素を非表示にするのみ必要がある場合は、多分それはちょうど/追加要素を削除するか、意味的に正しい構造をないことと比較して無効と組み合わせて、隠された属性を設定する方が良いだろう。

<select>  
  <option>Option1</option>
  <option>Option2</option>
  <option hidden>Hidden Option</option>
</select>

リファレンス


4
IE 11はこれをサポートしています。
イバン・ペレス

7
これが現代の答えです。理想的にはdisabledHTML5グローバルhidden属性をサポートしていないブラウザーがユーザーに視覚的に表示できるように、これもに設定します。
cloudworks

1
CSSでこのテクニックをどのように使用しますか?
GetFree 2016年

7
Safari、Edge、IEでは機能しません。 Safariのバグは10年前のものです。既存のパッチを更新してください。Edgeの課題追跡でバグが見つかりません。
2016年

7
これの回避策はを使用<option hidden disabled>することなので、すべての優れたブラウザで非表示になり、他のブラウザでは無効にします。
Ramon Balthazar、

37

有効なHTMLではないため、ラッパーを使用するソリューション使用しないことをお勧めします。これにより、<span>将来問題が発生する可能性があります。私は、非表示にするオプションを実際に削除し、必要に応じて元に戻すことをお勧めします。jQueryを使用すると、次の3つの関数のみが必要になります。

最初の関数は、選択の元の内容を保存します。安全のために、ページをロードするときにこの関数を呼び出すことができます。

function setOriginalSelect ($select) {
    if ($select.data("originalHTML") == undefined) {
        $select.data("originalHTML", $select.html());
    } // If it's already there, don't re-set it
}

この次の関数は、上記の関数を呼び出して、元のコンテンツが保存されていることを確認し、単純にDOMからオプションを削除します。

function removeOptions ($select, $options) {
    setOriginalSelect($select);
    $options.remove();
 }

最後の関数は、元のすべてのオプションに「リセット」したいときにいつでも使用できます。

function restoreOptions ($select) {
    var ogHTML = $select.data("originalHTML");
    if (ogHTML != undefined) {
        $select.html(ogHTML);
    }
}

これらの関数はすべて、jQuery要素を渡すことを想定していることに注意してください。例えば:

// in your search function...
var $s = $('select.someClass');
var $optionsThatDontMatchYourSearch= $s.find('options.someOtherClass');
restoreOptions($s); // Make sure you're working with a full deck
removeOptions($s, $optionsThatDontMatchYourSearch); // remove options not needed

これが実際の例です:http : //jsfiddle.net/9CYjy/23/


3
信頼できるハックではありません。正解です。
Jeremy Cook、

1
@DanBeaulieu以前のjsfiddleで誤って命名された関数がありました。上記のリンクを修正して更新しました。それをキャッチしてくれてありがとう。
ルーク

はい、これも私の選択でした。実際にコードを少し小さくして、最初にデータ値を変数に入れました。未定義の場合はオプションを保存し、それ以外の場合はオプションを復元します。私のニーズはそのようなものに固有のものでした。
diynevala

1
var value=$select.val(); $select.html(ogHTML); $select.val(value);復元後も選択した値を選択したままにしておく必要がありました。
diynevala

削除するオプションの選択と削除のサイクルは、1回しか機能しませんでした。その後、options.remove()は何の影響もありませんでした。restoreOptions($ s)を移動すると、常に数行を呼び出すため、常に完全で新鮮なSelectオブジェクトを操作していましたが、うまくいきました。
Newclique 2018

18

ライアンPの答えは次のように変更する必要があります。

    jQuery.fn.toggleOption = function (show) {
        $(this).toggle(show);
        if (show) {
            if ($(this).parent('span.toggleOption').length)
                $(this).unwrap();
        } else {
            **if ($(this).parent('span.toggleOption').length==0)**
                $(this).wrap('<span class="toggleOption" style="display: none;" />');
        }
    };

そうでなければ、それはあまりにも多くのタグに包まれます


5
HTML仕様(w3.org/TR/html5/forms.html#the-select-element)によると、に<select>は、<option>または<optgroup>またはスクリプトをサポートする要素のみを含める必要があります。したがって、無効な<span>ラッパーの使用は避けてください。
ルーク

9

toggleOption関数は完全ではなく、アプリケーションに厄介なバグをもたらしました。jQueryは.val()および.arraySerialize()と混同されます。オプション4と5を選択して、私の意味を確認してください。

<select id="t">
<option value="v1">options 1</option>
<option value="v2">options 2</option>
<option value="v3" id="o3">options 3</option>
<option value="v4">options 4</option>
<option value="v5">options 5</option>
</select>
<script>
jQuery.fn.toggleOption = function( show ) {
    jQuery( this ).toggle( show );
    if( show ) {
        if( jQuery( this ).parent( 'span.toggleOption' ).length )
            jQuery( this ).unwrap( );
    } else {
        jQuery( this ).wrap( '<span class="toggleOption" style="display: none;" />' );
    }
};

$("#o3").toggleOption(false); 
$("#t").change(function(e) {
    if($(this).val() != this.value) {
    console.log("Error values not equal", this.value, $(this).val());
    }
});
</script>

8

このように、選択入力はトリッキーです。代わりにそれを無効にするのはどうですか?これはクロスブラウザで機能します:

$('select').children(':nth-child(even)').prop('disabled', true);

これは他のすべてを無効にします <option>、要素ますが、必要な要素を選択できます。

ここにデモがあります:http : //jsfiddle.net/jYWrH/

注:要素の無効なプロパティを削除する場合は、を使用できます.removeProp('disabled')

更新

<option>非表示にする要素を非表示の選択要素に保存できます。

$('#visible').on('change', function () {
    $(this).children().eq(this.selectedIndex).appendTo('#hidden');
});

次に、<option>要素を元の選択要素に追加し直すことができます。

$('#hidden').children().appendTo('#visible');

これらの2つの例では、表示されている選択要素のIDがでvisibleあり、非表示の選択要素のIDがであることが想定されていますhidden

ここにデモがあります:http : //jsfiddle.net/jYWrH/1/

これ.on()はjQuery 1.7の新機能であり、この回答の使用法はhttp://api.jquery.com/onと同じ.bind()です。


7

簡単な答え:できません。フォーム要素のスタイル設定機能は非常に限られています。

最良の代替案はdisabled=true、オプションを設定することです(IEだけが自動的に行うため、おそらく灰色)。これにより、オプションがクリックできなくなります。

または、可能であれば、option要素を完全に削除します。


6
// Simplest way

var originalContent = $('select').html();

$('select').change(function() {
    $('select').html(originalContent); //Restore Original Content
    $('select option[myfilter=1]').remove(); // Filter my options
});

4

すでにJSを使用しているので、ページ上に非表示のSELECT要素を作成し、そのリストで非表示にしようとしているアイテムごとに、非表示のリストに移動します。これにより、簡単に復元できます。

純粋なCSSでそれを行う方法がわからない...私はdisplay:noneトリックが機能するだろうと思っていました。


2

!!! 警告!!!

2番目の「IF」を「WHILE」に置き換えるか、機能しません。

jQuery.fn.toggleOption = function( show ) {
    jQuery( this ).toggle( show );
    if( show ) {
        while( jQuery( this ).parent( 'span.toggleOption' ).length )
            jQuery( this ).unwrap( );
    } else {
        jQuery( this ).wrap( '<span class="toggleOption" style="display: none;" />' );
    }
};

2

<select>JavaScriptを使用してそれらを削除する必要があります。それが彼らを去らせる唯一の保証された方法です。


1
jQueryのを使用して、これは削除して行うことができます$('options').remove();
ルーク

2

これは私にとってクロームでうまくいくようです

$("#selectid span option").unwrap();
$("#selectid option:not([filterattr=filtervalue])").wrap('<span/>');

1
4つのスペースでインデントするか、コードを `で囲んで、コードにコード形式を追加してください。
バナナ

1
このコードは素晴らしいです!最新のchrome、firefox、IE 11で動作します。
それで

1
私の最後のコメントの前に、これはIE 7でも動作します!だからff 3.5、これは私が最後に思いついたものです、それはIEとクロムでオプションが非表示になる前に選択された値を保持し、オプションブラウザに戻った後に別の値が設定されていない場合はオプションが設定されます以前と同じように選択されました!
Sijav 2015

0

ゲームの終盤ですが、これらのほとんどはかなり複雑に見えます。

ここに私がそれをした方法があります:

var originalSelect = $('#select-2').html();

// filter select-2 on select-1 change
$('#select-1').change(function (e) {

    var selected = $(this).val();

    // reset select ready for filtering
    $('#select-2').html(originalCourseSelect);

    if (selected) {
        // filter
        $('#select-2 option').not('.t' + selected).remove();
    }

});

select-1のマークアップ:

<select id='select-1'>
<option value=''>Please select</option>
<option value='1'>One</option>
<option value='2'>Two</option>
</select>

select-2のマークアップ:

<select id='select-2'>
<option class='t1'>One</option>
<option class='t2'>Two</option>
<option>Always visible</option>
</select>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.