120 votes

Comment masquer une <option> dans un menu <sélect> avec CSS ?

J'ai réalisé que Chrome, apparemment, ne me permet pas de cacher <option> dans un <select> . Firefox le fera.

Je dois cacher le <option> qui correspondent à un critère de recherche. Dans les outils Web de Chrome, je peux voir qu'ils sont correctement définis comme suit display: none; par mon JavaScript, mais une fois alors <select> est cliqué, ils sont affichés.

Comment puis-je faire ces <option> qui correspondent à mes critères de recherche ne s'affichent PAS lorsque l'on clique sur le menu ? Merci !

5 votes

Au lieu de cacher et d'afficher sur une recherche. Essayez de remplir la sélection en fonction de la recherche.

1 votes

Je suis d'accord avec Henesnarfel. Si vous êtes déjà en train de faire une recherche ou une sorte de requête, vous devriez être en mesure de remplir ceux que vous voulez.

1 votes

ce fonctionne bien pour moi dans Chrome 16.0.912.77 m. Est-ce que je comprends mal le problème ?

108voto

Lukas Jelinek Points 91

Pour HTML5, vous pouvez utiliser l'attribut "hidden".

<option hidden>Hidden option</option>

Il est pas supporté par IE < 11. Mais si vous avez seulement besoin de masquer quelques éléments, peut-être serait-il préférable de simplement définir l'attribut hidden en combinaison avec disabled par rapport à l'ajout/la suppression d'éléments ou à des constructions non sémantiquement correctes.

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

Référence .

9 votes

C'est la réponse moderne. Dans l'idéal, nous devrions également régler ce paramètre sur disabled afin que les navigateurs qui ne prennent pas en charge l'option HTML5 global hidden attribut aura une indication visuelle pour l'utilisateur.

2 votes

Comment utilisez-vous cette technique avec CSS ?

9 votes

Ne fonctionne pas dans Safari, Edge, ni IE. Bug pour Safari a 10 ans, veuillez aider en mettant à jour les correctifs existants. Impossible de trouver le bogue dans le gestionnaire de problèmes Edge.

71voto

Ryan P Points 8292

Vous devez mettre en œuvre deux méthodes de dissimulation. display: none fonctionne pour FF, mais pas pour Chrome ou IE. La deuxième méthode consiste donc à envelopper le <option> dans un <span> avec display: none . FF ne le fera pas (HTML techniquement invalide, selon la spécification) mais Chrome et IE le feront et masqueront l'option.

EDIT : Oh oui, j'ai déjà implémenté ceci dans 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;" />' );
    }
};

EDIT 2 : Voici comment utiliser cette fonction :

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

EDIT 3 : Ajout d'une vérification supplémentaire suggérée par @user1521986

1 votes

Cette méthode farfelue est la seule qui ait fonctionné sur tous les navigateurs et qui n'ait pas impliqué la création d'une fausse boîte de sélection cachée.

15 votes

Faites attention avec ça. Cela semble bien fonctionner au début, mais quelque part, ça s'arrête. Voici une petite démo : jsfiddle.net/Yb6sk/9

17 votes

Bien que cette solution permette de masquer l'élément, toute tentative de lecture de la valeur de l'élément <select> (en utilisant l'outil jQuery .val() ) renverra null . Je viens de le tester dans Chrome 29, alors attention aux Googlers !

37voto

Luke Points 1780

Je vous suggère de faire pas utiliser les solutions qui utilisent un <span> car il ne s'agit pas d'un code HTML valide, ce qui pourrait causer des problèmes par la suite. Je pense que la meilleure solution est de supprimer toutes les options que vous souhaitez masquer, et de les restaurer si nécessaire. En utilisant jQuery, vous n'aurez besoin que de ces 3 fonctions :

La première fonction permet de sauvegarder le contenu original du fichier sélectionnez . Par sécurité, vous pouvez appeler cette fonction lorsque vous chargez la page.

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

La fonction suivante appelle la fonction ci-dessus pour s'assurer que le contenu original a été sauvegardé, puis supprime simplement les options du DOM.

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

La dernière fonction peut être utilisée chaque fois que vous voulez "réinitialiser" toutes les options d'origine.

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

Notez que toutes ces fonctions s'attendent à ce que vous transmettiez des éléments jQuery. Par exemple :

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

Voici un exemple concret : http://jsfiddle.net/9CYjy/23/

3 votes

Fiable et pas un pirate. Excellente réponse !

1 votes

@DanBeaulieu Il y avait une fonction mal nommée dans le jsfiddle précédent. J'ai corrigé et mis à jour le lien ci-dessus. Merci de l'avoir remarqué.

0 votes

Oui, c'était aussi mon choix. J'ai réussi à réduire un peu le code, en prenant d'abord la valeur des données dans une variable, si elle n'est pas définie, elle sauvegarde les options, sinon elle les restaure. Mon besoin était spécifique pour cela.

18voto

JeffT Points 151

La réponse de Ryan P devrait être changée en :

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

Sinon, il sera enveloppé dans trop de balises

5 votes

Notez que selon les spécifications HTML ( w3.org/TR/html5/forms.html#the-select-element ), a <select> ne doit contenir que <option> ou <optgroup> ou des éléments supportant le script. Vous devez donc éviter d'utiliser des éléments non valides <span> enveloppes.

9voto

Batiste Bieler Points 81

La fonction toggleOption n'est pas parfaite et a introduit de méchants bogues dans mon application. jQuery s'embrouille avec .val() et .arraySerialize(). Essayez de sélectionner les options 4 et 5 pour voir ce que je veux dire :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X