2015-05-01 4 views
0

У меня есть несколько выпадающих списков с одинаковыми параметрами. Мой код отлично работает, когда пользователь выбирает первый элемент выпадающих списков, после чего элемент удаляется для второго и третьего выпадающих списков. Аналогично это происходит для второго выпадающего списка. Но проблема возникает, когда я сначала выбираю элемент второго выпадающего списка. Автоматически первый выпадающий список пуст, если я изменю свой код, чтобы включить все комбинации удаления в выпадающее событие jquery onchange(). Мой код:выберите один элемент из раскрывающегося списка удалить из других выпадающих списков JQuery

$('#skill1').on('change', function() { 
    var n = $("#skill1 option:selected").text(); 
    var index = $('#skill1').get(0).selectedIndex; 
    $('#skill2 option:eq(' + index + ')').remove(); 
    $('#skill3 option:eq(' + index + ')').remove(); 
}); 

$('#skill2').on('change', function() { 
    var p = $("#skill2 option:selected").text(); 
    var index1 = $('#skill2').get(0).selectedIndex; 
    $('#skill3 option:eq(' + index1 + ')').remove(); 
}); 

$('#skill3').on('change', function() { 
    var r = $("#skill3 option:selected").text(); 
    var index2 = $('#skill3').get(0).selectedIndex; 
}); 

Пожалуйста, помогите, так что код может распространяться, когда выбор какого-либо элемента производится в выпадающем списке изменения отражаются в другом выпадающем списке

+0

Итак, если вы выберете опцию в любом из выпадающих списков, вы хотите, чтобы соответствующая опция была удалена из двух других раскрывающихся меню? – aphextwix

+0

yes Я хочу, чтобы соответствующая опция была удалена из других двух раскрывающихся меню –

+0

Ну, вам не хватает команды remove из других функций 'on change'? Также вы устанавливаете переменные для 'n',' p' и 'r', но вы, похоже, не используете их? Для чего они? – aphextwix

ответ

0

Я надеюсь, что этот подход может дайте несколько идей:

1- Добавить класс для каждого выбора, чтобы вы могли получить массив из них.

2- Добавить событие изменения к элементам, содержащим класс: при каждом изменении, итерации по массиву и удалении опции, содержащей выделенный текст. Чтобы предотвратить стирание опций из выбора, вызвавшего событие или предыдущие (как я думаю, это ваше намерение), установите защитник (startRemoving), который предотвращает стирание чего-либо из любого выбора, предшествующего событию, вызвавшему событие.

var $combo = $(".combo"); 
$combo.on("change", function() { 
    var select = this, 
     selected = $("option:selected", this).text(), 
     startRemoving = false; 

    $combo.each(function (_, el) { 
     if (el === select) { 
      startRemoving = true; 
      return; 
     } 

     if (startRemoving) { 
      $("option", el).each(function (_, el) { 
       var $el = $(el); 
       if ($el.text() === selected) { 
        $el.remove(); 
       } 
      }); 
     } 
    }); 
}); 

Это только идея. Вы можете видеть, что работает в этом fiddle

UPDATE

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

var $combo = $(".combo"); 
$combo.on("change", function() { 
    var select = this, 
     selected = $("option:selected", this).text(); 

    $combo.each(function (_, el) { 
     if (el !== select) { 
      $("option", el).each(function (_, el) { 
       var $el = $(el); 
       if ($el.text() === selected) { 
        $el.remove(); 
       } 
      }); 
     } 
    }); 
}); 

fiddle

+0

Код работает нормально, но когда я выбираю параметр из второго раскрывающегося списка, изменение не отражается в первом выпадающем списке. Также обратное изменение не происходит, когда мы выбираем опцию из третьего раскрывающегося меню, изменение не отражается в первом или втором выпадающем списке –

+0

@tendo Привет, я думал, что вы так хотите. Я обновил вопрос с помощью комбо, изменения которого влияют на остальные комбо (кроме тех, которые вызвали событие). Надеюсь, это поможет! – acontell

+0

спасибо за ответ –

0

не знаю, если это вариант для вас, но вы можете думать об использовании AngularJS здесь, поскольку это, кажется, является ярким примером для него. Там вы можете определить все свои параметры как массив внутри области действия, и как только что-то изменится, все выпадающие списки будут автоматически обновляться.

Посмотрите, что Fiddle

function MyCtrl($scope) { 
    $scope.options = ["option1","option2","option3","option4"] 
} 

Это будет объем пор.

+0

Спасибо Да, его решение проблемы. Затем я просмотрю документацию Angular JS –

Смежные вопросы