Подтвердить что ты не робот

Параметр jQuery <select> отключен, если выбран в другом <select>

Я пытаюсь отключить параметр, если он выбран в любом из вариантов

Так, например, если name= "select1" выбрал опцию "Тест 2", то я хочу, чтобы "Тест 2" был отключен в обоих операторах выбора... и если что-то еще проверяется, чтобы он снова включал предыдущий вариант.

Я написал образец script здесь, на который, как я думал, меня "закрыло"... но это заставило меня подальше от базы. Любая помощь будет оценена.

<script type="text/javascript">
$(document).ready(function(){
 $("select").change(function() {
  $("select").find("option:selected").attr('disabled', true);
 });
});
</script>

<select name="select1">
    <option>No Match</option>
    <option value="1">Test</option>
    <option value="2">Test 2</option>
    <option value="3">Test 3</option>
</select>

<select name="select2">
    <option>No Match</option>
    <option value="1">Test</option>
    <option value="2">Test 2</option>
    <option value="3">Test 3</option>
</select>
4b9b3361

Ответ 1

Live demo: http://jsfiddle.net/dZqEu/

$('select').change(function() {

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

    $(this).siblings('select').children('option').each(function() {
        if ( $(this).val() === value ) {
            $(this).attr('disabled', true).siblings().removeAttr('disabled');   
        }
    });

});

Вы можете предпочесть эту версию кода:

$('select').change(function() {

    $(this)
        .siblings('select')
        .children('option[value=' + this.value + ']')
        .attr('disabled', true)
        .siblings().removeAttr('disabled');

});

Live demo: http://jsfiddle.net/dZqEu/2/

Обратите внимание, что эта вторая версия является однострочным (одна строка кода), но я отформатировал ее, чтобы она была более читаемой. Мне нравится эта вторая версия лучше.


Также обратите внимание, что в моем коде предполагается, что эти два поля SELECT являются элементами DOM. Если это не ваш случай, то этот код - $(this).siblings('select') - не сработает для вас, и вам придется использовать методы обхода jQuery для перехода в другое поле SELECT.

В худшем случае - когда ячейки SELECT находятся далеко друг от друга в дереве DOM, а перемещение будет неэффективным - вы можете просто назначить им идентификационные атрибуты и использовать этот код для выбора другого поля:

$('#select1, #select2').not(this)

Live demo: http://jsfiddle.net/dZqEu/3/

Ответ 2

Попробуйте следующее:

$(document).ready(function(){  
  $("select").change(function() {   
    $("select").not(this).find("option[value="+ $(this).val() + "]").attr('disabled', true);
  }); 
}); 

Если вы хотите включить ранее отключенную опцию (когда значение не выбрано из другого комбо), используйте эту расширенную версию:

$(document).ready(function () {
    $("select").change(function () {
        var $this = $(this);
        var prevVal = $this.data("prev");
        var otherSelects = $("select").not(this);
        otherSelects.find("option[value=" + $(this).val() + "]").attr('disabled', true);
        if (prevVal) {
            otherSelects.find("option[value=" + prevVal + "]").attr('disabled', false);
        }

        $this.data("prev", $this.val());
    });
});

Ответ 3

Проблема с вашим кодом заключается в том, что в рамках процедуры change() вы просматриваете все выбранные, а не те, которые изменили и отключили все выбранные записи. Вам нужно найти значение выбранной записи и отключить ее в других вариантах, а не в текущем.

Что-то вроде этого может быть полезно [untested]:

$(document).ready(function() {
  $("select").each(function(cSelect) {
    $(this).data('stored-value', $(this).val());
  });

  $("select").change(function() {
    var cSelected = $(this).val();
    var cPrevious = $(this).data('stored-value');
    $(this).data('stored-value', cSelected);

    var otherSelects = $("select").not(this);

    otherSelects.find('option[value=' + cPrevious + ']').removeAttr('disabled');
    otherSelects.find('option[value=' + cSelected + ']').attr('disabled', 'disabled');
  });
});

Бит stored-value - это то, что вы знаете, какие опции включить в других полях <select>.

Ответ 4

Если у вас больше двух, выберите:

$('select').on('change', function() {
    $('select option').removeAttr('disabled');
    $('select').each(function(i, elt) {
        $('select').not(this).find('option[value="'+$(elt).val()+'"]').attr('disabled', true);
    });
});