jQuery disable SELECT options based on Radio selected (Need support for all browsers) jQuery disable SELECT options based on Radio selected (Need support for all browsers) jquery jquery

jQuery disable SELECT options based on Radio selected (Need support for all browsers)


The proper way to achieve the functionality you want is just to remove the options. As you discovered the hard way, disabling individual options is not supported particularly well across browsers. I just woke up and feel like programming something so I whipped up a small plugin to easily filter a select based on a radio's selected ID attribute. Although the rest of the solutions will get the job done, if you are planning on doing this throughout your app this should help. If not, then I guess it's for anyone else that stumbles upon this. Here is the plugin code you could stash away somewhere:

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

And here is how to use it:

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

The first argument is a selector for the radio group, the second a dictionary where the keys are the radio ID to match, and the value is an array of what select option values should remain. There's a lot of things that could be done to abstract this further, let me know if you are interested and I could certainly do that.

Here is a demo of it in action.

EDIT: Also, forgot to add, according to the jQuery documentation:

In jQuery 1.3 [@attr] style selectors were removed (they were previously deprecated in jQuery 1.2). Simply remove the '@' symbol from your selectors in order to make them work again.


You want something like this - Example Code here

$(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:

Improved version of the code, using regular expression to filter options based on option values. Working example here. You can edit the example by adding /edit to the 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:

Since the disabled attribute doesn't appear to work reliably across browsers, I think your only option is to remove the option elements not needed when a radio button is selected. Working Example here

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

or even

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


the first problem is with

$(this).val()

replace it with

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

then this will not work

$("'theOptions'..")

use

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