30 votes

jQuery désactive les options SELECT en fonction de la radio sélectionnée (support requis pour tous les navigateurs)

Bon d'avoir un peu de mal à ici, a voulu désactiver certaines options lors de la sélection d'une radio. Lorsque ABC est sélectionné désactiver les 1,2 & 3 options, etc...

$("input:radio[@name='abc123']").click(function() {
   if($(this).val() == 'abc') {

      // Disable 
      $("'theOptions' option[value='1']").attr("disabled","disabled");
      $("'theOptions' option[value='2']").attr("disabled","disabled");
      $("'theOptions' option[value='3']").attr("disabled","disabled");

   } else {
      // Disbale abc's
   }    
});

ABC: <input type="radio" name="abc123" id="abc"/>
123: <input type="radio" name="abc123" id="123"/>

<select id="theOptions">
  <option value="1">1</option>
  <option value="2">2</option>
  <option value="3">3</option>
  <option value="a">a</option>
  <option value="b">b</option>
  <option value="c">c</option>
</select>

Pas de travail, des idées?

Mise à JOUR:

Ok j'ai eu l'activer/désactiver travail mais un nouveau problème a surgi. Les personnes handicapées options pour mon sélectionner la zone de travail uniquement dans FF et IE8. J'ai testé IE6 et les personnes handicapées n'est pas de travail. J'ai essayé d'utiliser le hide() et show() avec pas de chance non plus. essentiellement, j'ai besoin de cacher/désactiver/supprimer les options (pour tous les navigateurs) et être capable de les rajouter si la case d'option est sélectionnée, et vice-versa.

CONCLUSION:

Merci pour toutes les solutions, la plupart de tous répondu à ma question d'origine. Beaucoup d'ACCESSOIRES pour tous :)

68voto

Paolo Bergantino Points 199336

La bonne façon de réaliser les fonctionnalités que vous voulez, c'est juste pour supprimer les options. Comme vous l'avez découvert la manière dure, la désactivation des options individuelles n'est pas pris en charge particulièrement bien dans les navigateurs. Je viens de me réveiller et d'avoir envie de quelque chose de programmation donc j'ai préparé un petit plugin de filtrer facilement une sélection basée sur une radio sélectionnée de l'attribut ID. Bien que le reste de la solutions le travail sera fait, si vous prévoyez de le faire tout au long de votre application, ce devrait aider. Si non, alors je suppose que c'est pour quelqu'un d'autre qui tombe sur cette. Voici le code du plugin, vous pourriez ranger quelque part:

jQuery.fn.filterOn = function(radio, values) {
    return this.each(function() {
        var select = this;
        var options = [];
        $(select).find('option').each(function() {
            options.push({value: $(this).val(), text: $(this).text()});
        });
        $(select).data('options', options);
        $(radio).click(function() {
            var options = $(select).empty().data('options');
            var haystack = values[$(this).attr('id')];
            $.each(options, function(i) {
                var option = options[i];
                if($.inArray(option.value, haystack) !== -1) {
                    $(select).append(
                    $('<option>').text(option.text).val(option.value)
                    );
                }
            });
        });            
    });
};

Et voici comment l'utiliser:

$(function() {
    $('#theOptions').filterOn('input:radio[name=abc123]', {
        'abc': ['a','b','c'],
        '123': ['1','2','3']        
    });
});

Le premier argument est un sélecteur pour le groupe de boutons radio, la deuxième un dictionnaire dont les clés sont l'ID de la radio de match, et la valeur est un tableau de ce qu'sélectionnez l'option valeurs doivent rester. Il y a beaucoup de choses qui peut être fait abstraction de cela, laissez-moi savoir si vous êtes intéressé et je pourrais certainement le faire.

Voici une démo de en action.

EDIT: Aussi, j'ai oublié d'ajouter, selon le jQuery documentation:

En jQuery 1.3 [@attr] les sélecteurs de style ont été supprimés (ils étaient déjà obsolète en jQuery 1.2). Retirez simplement le symbole " @ " à partir de votre sélecteurs afin de les faire fonctionner de nouveau.

16voto

Russ Cam Points 58168

Vous voulez quelque chose de ce genre - Exemple de Code ici

$(function() {

$("input:radio[@name='abc123']").click(function() {
   if($(this).attr('id') == 'abc') {

      // Disable 123 and Enable abc
      $("#theOptions option[value='1']").attr("disabled","disabled");
      $("#theOptions option[value='2']").attr("disabled","disabled");
      $("#theOptions option[value='3']").attr("disabled","disabled");
      $("#theOptions option[value='a']").attr("selected","selected");
      $("#theOptions option[value='a']").attr("disabled","");
      $("#theOptions option[value='b']").attr("disabled","");
      $("#theOptions option[value='c']").attr("disabled","");

   } else {
      // Disable abc's and Enable 123
      $("#theOptions option[value='a']").attr("disabled","disabled");
      $("#theOptions option[value='b']").attr("disabled","disabled");
      $("#theOptions option[value='c']").attr("disabled","disabled");
      $("#theOptions option[value='1']").attr("selected","selected");          
      $("#theOptions option[value='1']").attr("disabled","");   
      $("#theOptions option[value='2']").attr("disabled","");
      $("#theOptions option[value='3']").attr("disabled","");

   }    
});

});

EDIT:

Version améliorée du code, en utilisant l'expression régulière à des options de filtrage basé sur les valeurs de l'option. Exemple de travail ici. Vous pouvez modifier l'exemple par l'ajout d' /edit de l'URL

$(function() {

    $("input:radio[@name='abc123']").click(function() {

        // get the id of the selected radio
        var radio = $(this).attr('id'); 

        // set variables based on value of radio
        var regexDisabled = radio == 'abc' ?  /[1-3]/ : /[a-c]/;      
        var regexEnabled = radio == 'abc' ? /[a-c]/ : /[1-3]/;
        var selection = radio == 'abc' ? 'a' : 1;

        // select all option elements who are children of id #theOptions
        $("#theOptions option")
            // filter the option elements to only those we want to disable
            .filter( function() { return this.value.match(regexDisabled);})
            // disable them
            .attr("disabled","disabled")
            // return to the previous wrapped set i.e. all option elements
            .end()
            // and filter to those option elements we want to enable
            .filter( function() { return this.value.match(regexEnabled);})
            // enable them
            .attr("disabled","");
       // change the selected option element in the dropdown
       $("#theOptions option[value='" + selection + "']").attr("selected","selected");

    });

});

EDIT 2:

Depuis le désactivé attribut ne fonctionne pas de manière fiable, sur tous les navigateurs, je pense que votre seule option est de supprimer l'option éléments ne sont pas nécessaires lorsqu'un bouton radio est sélectionné. Exemple de travail ici

  $(function() {

        $("input:radio[@name='abc123']").click(function() {

            // store the option elements in an array
            var options = [];
            options[0] = '<option value="1">1</option>';
            options[1] = '<option value="2">2</option>';
            options[2] = '<option value="3">3</option>';
            options[3] = '<option value="a">a</option>';
            options[4] = '<option value="b">b</option>';
            options[5] = '<option value="c">c</option>';


            var radio = $(this).attr('id');   
            var regexEnabled = radio == 'abc' ? /[a-c]/ : /[1-3]/;

            // set the option elements in #theOptions to those that match the regular expression
            $("#theOptions").html(
            $(options.join(''))
                // filter the option elements to only those we want to include in the dropdown
                .filter( function() { return this.value.match(regexEnabled);})
            );


        });

    });

ou même

  $(function() {

        // get the child elements of the dropdown when the DOM has loaded
        var options = $("#theOptions").children('option');

        $("input:radio[@name='abc123']").click(function() {         

            var radio = $(this).attr('id');   
            var regexEnabled = radio == 'abc' ? /[a-c]/ : /[1-3]/;

            // set the option elements in #theOptions to those that match the regular expression
            $("#theOptions").html(
            $(options)
                // filter the option elements to only those we want to include in the dropdown
                .filter( function() { return this.value.match(regexEnabled);})
            );

        }); 
    });

3voto

TheVillageIdiot Points 22158

le premier problème est avec

 $(this).val()
 

le remplacer par

 $(this).attr('id') == 'abc'
 

alors cela ne fonctionnera pas

 $("'theOptions'..")
 

utilisation

 $("#theOptions option[value='1']").attr('disabled','disabled') //to disable
$("#theOptions option[value='a']").attr('disabled','') //to ENABLE
 

1voto

Temple Points 630

Quel navigateur utilisez-vous? Je ne l'ai jamais utilisé auparavant, mais il semble ne pas être pris en charge dans IE avant IE8. Voir ce lien pour plus d'informations:

http://www.w3schools.com/TAGS/att_option_disabled.asp

0voto

jamil Points 74

corrigez simplement le sélecteur $ (option "'les options' [valeur = '1']")
deviendra $ ("option # theOptions [valeur = '1']")

et tout ira bien

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