Параметр 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>
Ответы
Ответ 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);
});
});