CSS ile <seç> menüsünde bir <seçenek> nasıl gizlenir?


104

Görünüşe göre Chrome'un <option>bir <select>. Firefox yapacak.

<option>Bir arama kriterine uyan ’leri gizlemem gerekiyor . Chrome web araçlarında display: none;, JavaScript'im tarafından doğru şekilde ayarlandıklarını görebiliyorum , ancak daha sonra <select>menü tıklandığında gösteriliyorlar.

<option>Arama kriterlerime uyan bu ’ lerin menü tıklandığında gösterilmemesini nasıl sağlayabilirim ? Teşekkürler!


4
Bir aramada saklanmak ve göstermek yerine. Aramaya bağlı olarak seçimi deneyin ve
doldurun

1
Henesnarfel'e katılıyorum. Zaten bir arama veya bir tür sorgu yapıyorsanız, sadece istediklerinizi doldurabilmelisiniz.
Michael Stramel

1
bu benim için Chrome 16.0.912.77 m'de iyi çalışıyor. Sorunu yanlış mı anlıyorum?
mgibsonbr

3
@mgibsonbr Tarayıcılar arası çalışmıyor.
Jasper

3
@Henesnarfel Seçenekleri gizlemek için iyi nedenler olabilir. Örneğin, seçili liste kutusu ve devre dışı olarak işaretlenen öğeleri gizlemek veya göstermek için bağlantılar içeren bir sayfam vardı. Kullanıcı bu seçeneği her değiştirdiğinde birden fazla listeyi saklamak veya sunucuyu yeni bir liste için sorgulamak için hiçbir neden yok.
Ryan P

Yanıtlar:


69

Gizlemek için iki yöntem uygulamanız gerekir. display: noneFF için çalışır, ancak Chrome veya IE için çalışmaz. Yani ikinci yöntem tamamlıyor <option>bir de <span>sahip display: none. FF bunu yapmaz (teknik olarak geçersiz HTML, spesifikasyona göre), ancak Chrome ve IE bunu yapacak ve seçeneği gizleyecektir.

DÜZENLEME: Oh evet, bunu zaten jQuery'de uyguladım:

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

DÜZENLEME 2: Bu işlevi şu şekilde kullanırsınız:

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

DÜZENLEME 3: @ user1521986 tarafından önerilen ekstra kontrol eklendi


1
Bu çılgın yöntem, aslında tamamen tarayıcılar arasında çalışan ve sahte bir gizli seçim kutusu hack oluşturmayı içermeyen tek yöntemdir.
Jesse Atkinson

15
Buna dikkat et. İlk başta harika çalışıyor gibi görünüyor ama hat boyunca bir yerde duruyor. İşte küçük bir demo: jsfiddle.net/Yb6sk/9
Bill Criswell

17
Bu çözüm öğeyi gizlemese de, <select>(jQuery'leri kullanarak .val()) değerini okumaya yönelik herhangi bir girişim geri dönecektir null. Bunu Chrome 29'da test ettim, bu yüzden Google çalışanları dikkatli olun!
Mark

10
İlginç bir hack, ancak mümkünse "teknik olarak geçersiz HTML" den kaçınmanızı tavsiye ederim.
Luke

3
Doğru, tüm tarayıcıların farklı uygulamaları vardır. Ancak tarayıcıların standart özellikleri tam olarak uygulayamamasının bir nedeni, teknik özelliklere uymayan çok fazla canlı kod bulunmasıdır. IMO: Başka çözüm yoksa, kesinlikle bir hack kullanın. Eğer Spec takip edebilirsiniz Ama eğer ve sorunu çözmek, neden değil mi? Kodunuzun başkalarıyla iyi oynamasına ve teknik özellikleri güçlendirmesine yardımcı olur.
Luke

84

HTML5 için "gizli" özelliğini kullanabilirsiniz.

<option hidden>Hidden option</option>

O edilir değil IE <11. desteklediği Ama eğer belki ekleme / elemanlarını kaldırma veya anlam doğru yapılar değil yapıyor kıyasla daha iyi özürlü ile birlikte sadece belirlenen gizli özniteliği olacaktır, birkaç öğeleri gizlemek elde etmesi yeterli.

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

Referans .


4
IE 11 bunu destekler.
Iván Pérez

7
Bu modern cevap. İdeal olarak bunu disabled, HTML5 global hiddenözniteliğini desteklemeyen tarayıcıların kullanıcı için bazı görsel belirtilere sahip olması için de ayarlıyoruz .
cloudworks

1
Bu tekniği CSS ile nasıl kullanıyorsunuz?
GetFree

7
Safari, Edge veya IE'de çalışmaz. Safari için Bug 10 yaşında, lütfen mevcut yamaları güncelleyerek yardım edin. Edge sorun izleyicide hata bulunamıyor.
Indolering

7
Bunun için bir geçici çözüm kullanmaktır <option hidden disabled>, bu nedenle tüm iyi tarayıcılarda gizlenir ve diğerlerinde devre dışı bırakılır.
Ramon Balthazar

37

Sana do öneririz değil bir kullanmak çözümler kullanmak <span>o yolda sorunlara neden olabilecek geçerli HTML, olmadığı için sarmalayıcı. Bence tercih edilen çözüm, gizlemek istediğiniz tüm seçenekleri gerçekten kaldırmak ve gerektiğinde geri yüklemek. JQuery'yi kullanarak yalnızca şu 3 işleve ihtiyacınız olacak:

İlk işlev orijinal içeriğini kurtaracak seçin . Sadece güvende olmak için, sayfayı yüklediğinizde bu işlevi çağırmak isteyebilirsiniz.

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

Bu sonraki işlev, orijinal içeriğin kaydedildiğinden emin olmak için yukarıdaki işlevi çağırır ve ardından seçenekleri DOM'dan kaldırır.

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

Son işlev, tüm orijinal seçeneklere "sıfırlamak" istediğinizde kullanılabilir.

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

Tüm bu işlevlerin jQuery öğelerini iletmenizi beklediğini unutmayın. Örneğin:

// 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

İşte çalışan bir örnek: http://jsfiddle.net/9CYjy/23/


3
Güvenilir ve hack değil. Mükemmel cevap!
Jeremy Cook

1
@DanBeaulieu Önceki jsfiddle'da yanlış isimlendirilmiş bir işlev vardı. Yukarıdaki bağlantıyı düzelttim ve güncelledim. Yakaladığınız için teşekkürler.
Luke

Evet, bu da benim seçimimdi. Aslında, önce veri değerini bir değişkene alarak kodu biraz daha küçük golf oynamayı başardım, eğer tanımlanmamışsa seçenekleri kaydedecek, yoksa seçenekleri geri yükleyecektir. Benim ihtiyacım buna özeldi.
diynevala

1
var value=$select.val(); $select.html(ogHTML); $select.val(value);Geri yüklemeden sonra bile seçilen değeri seçili tutmak için eklemem gerekiyordu.
diynevala

Bunları kaldırmak ve kaldırmak için seçenekleri seçme döngüsü yalnızca bir kez çalıştı. Bundan sonra options.remove () 'un benim için bir etkisi olmadı. RestoreOptions'ı ($ s) taşıdığımda birkaç satırı çağırdı, böylece her zaman tam ve taze bir Select nesnesiyle çalışıyordum, işe yaradı.
Newclique

18

Ryan P'nin cevabı şu şekilde değiştirilmelidir:

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

Aksi takdirde, çok fazla etikete sarılır


5
HTML özelliklerine ( w3.org/TR/html5/forms.html#the-select-element ) göre, a'nın<select> yalnızca <option>veya <optgroup>veya komut dosyası destekleyen öğeleri içermesi gerektiğini unutmayın . Bu nedenle geçersiz <span>sarmalayıcılar kullanmaktan kaçınmalısınız .
Luke

9

ToggleOption işlevi mükemmel değil ve uygulamamda kötü hatalar ortaya çıktı. jQuery .val () ve .arraySerialize () ile karıştırılacak ne demek istediğimi görmek için 4 ve 5 seçeneklerini seçmeyi deneyin:

<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

Bu şekilde belirli girişler aldatıcıdır. Bunun yerine devre dışı bırakmaya ne dersiniz, bu tarayıcılar arası çalışacaktır:

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

Bu, diğer tüm <option>öğeleri devre dışı bırakır , ancak hangisini istediğinizi seçebilirsiniz.

İşte bir demo: http://jsfiddle.net/jYWrH/

Not: Bir elemanın devre dışı bırakılmış özelliğini kaldırmak isterseniz kullanabilirsiniz. .removeProp('disabled') .

Güncelleme

<option>Gizlemek istediğiniz öğeleri gizli seçim öğesinde kaydedebilirsiniz :

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

Daha sonra <option>öğeleri orijinal seçim öğesine geri ekleyebilirsiniz :

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

Bu iki örnekte, görünür seçme öğesinin kimliğine visibleve gizli seçme öğesinin kimliğine sahip olması beklenir .hidden .

İşte bir demo: http://jsfiddle.net/jYWrH/1/

Not .on()jQuery 1.7 ve bu yanıt için kullanımında yeni aynıdır .bind(): http://api.jquery.com/on


7

Basit cevap: Yapamazsınız. Form öğelerinin çok sınırlı stil yetenekleri vardır.

En iyi alternatif disabled=true, seçeneği ayarlamaktır (ve belki gri bir renk, çünkü bunu yalnızca IE otomatik olarak yapar) ve bu, seçeneği tıklanamaz hale getirecektir.

Alternatif olarak, eğer yapabiliyorsanız, optionelemanı tamamen kaldırın .


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

Zaten JS kullandığınız için, sayfada gizli bir SELECT öğesi oluşturabilir ve bu listede gizlemeye çalıştığınız her öğe için onu gizli listeye taşıyabilirsiniz. Bu şekilde kolayca geri yüklenebilirler.

Bunu saf CSS ile yapmanın bir yolunu bilmiyorum ... Ekranın hiçbir hile işe yaramayacağını düşünürdüm.


2

!!! UYARI !!!

İkinci "EĞER" i "WHILE" ile değiştirin veya çalışmıyor!

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

Bunları <select>JavaScript kullanarak kaldırmalısınız . Bu onları uzaklaştırmanın tek garantili yolu.


1
JQuery kullanarak bu, remove ile yapılabilir:$('options').remove();
Luke

2

bu benim için Chrome'da çalışıyor gibi görünüyor

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

1
Lütfen kodunuza 4 boşluk girerek veya kodunuzu ".
Banana

1
bu kod harika! en son chrome, firefox ve IE 11 üzerinde çalışıyor, bu benim için yeterince iyi :)
Sijav

1
Son yorumumdan önce, bu şey IE 7'de de çalışıyor! bu yüzden ff 3.5, en sonunda bulduğum şey bu, bir şekilde IE ve chrome'da seçenekler gizlenmeden önce seçilen değeri koruyor ve eğer başka bir değer ayarlanmazsa, seçenekler geri getirildikten sonra tarayıcı seçeneği ayarlayacak daha önce olduğu gibi seçildi!
Sijav

0

Oyuna geç kaldı, ancak bunların çoğu oldukça karmaşık görünüyor.

İşte bunu nasıl yaptım:

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 işaretlemesi:

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

select-2 işaretlemesi:

<select id='select-2'>
<option class='t1'>One</option>
<option class='t2'>Two</option>
<option>Always visible</option>
</select>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.