個人的には、実装する方法は、単純にキャッシングの目的のために、すべての可能なオプションを含む「マスター」ドロップダウンを設けることです。これらのオプションは、それぞれの「スレーブ」ドロップダウンで複製されます。任意のスレーブドロップダウンが変更されるたびに、2つのドロップダウンが同じ選択された値を共有することができないように、すべてのスレーブドロップダウンが再度設定されます。
デモンストレーションの目的で、私は下のコードで3つのドロップダウンリストを使って作業しましたが、かなり簡単にスケールアップする必要があります。モードドロップダウンを追加して、それらに属性class="slave"
が含まれていることを確認してください。
また、すべてのオプションが削除されないようにするには、スレーブのすべてのドロップダウンリスト(デフォルトのオプションなど)に存在できるようにするには、属性class="immune"
マスタードロップダウンのオプションタグに移動します。
<script type="text/javascript">
// document - on load
$(document).ready(function() {
// initially populate all the drop downs
PopulateAllDropDowns();
// populate all drop downs on each subsequent change
$('select.slave').change(function(){
PopulateAllDropDowns();
});
});
function PopulateAllDropDowns()
{
// populate all the slave drop downs
$('select.slave').each(function(index){
PopulateDropDown($(this).attr('id'));
});
}
function PopulateDropDown(id)
{
// preserve the selected value
var selectedValue = $('#'+id).val();
// clear current contents
$('#'+id).html('');
// attempt to add each option from the master drop down
$('select#ddlTemplate').children('option').each(function(index){
// scope-safe var
var masterOptionValue = $(this).val();
// check if option is in use in another slave drop down, unless it's immune
var optionInUse = false;
if (!$(this).hasClass("immune"))
{
$('select.slave option:selected').each(function(index){
if (masterOptionValue == $(this).val())
optionInUse = true;
});
}
// if it's not in use, add it to this slave drop down
if (!optionInUse)
{
// create new option
var newOption = $('<option></option>').val($(this).val()).html($(this).text());
// ensure selected value is preserved, if applicable
if (selectedValue == $(this).val())
newOption.attr('selected', 'selected')
// add the option
$('#'+id).append(newOption);
}
});
}
</script>
<form>
<!-- master drop down -->
<select id="ddlTemplate" class="master" style="display:none">
<option value="" class="immune">Select ...</option>
<option value="a">Option A</option>
<option value="b">Option B</option>
<option value="c">Option C</option>
<option value="d">Option D</option>
<option value="e">Option E</option>
</select>
<!-- slave drop downs -->
<select id="ddlOne" class="slave"></select>
<select id="ddlTwo" class="slave"></select>
<select id="ddlThree" class="slave"></select>
</form>
お役に立てば幸いです。
ありがとうございます。私はあなたが「免疫」クラスを使用した方法が好きです。 – Matt