使用Javascript维护一组选择下拉列表
Maintain a set of select drop down lists using Javascript
我有一组下拉列表(总共8个)。所有下拉列表都有相同的下拉选项集。但是,业务要求是确保用户不能多次选择同一个选项。
看看这个问题,一开始它看起来很简单,但很快就变成了大量的代码。然而,这似乎是一个相对常见的问题。有人知道解决方案吗?有没有关于如何在不编写大量Javascript的情况下做到这一点的提示。某种可重用的jquery插件可能也很方便。一个存在吗?
一个问题是,当选择一个选择项目时,其他选择列表将无法使用该项目。该项目将从其他选择下拉列表中删除。当它再次可用时(下拉菜单发生更改),需要将其插入列表中的正确位置(下拉菜单选项有顺序)。这是我的解决方案开始变得相当复杂的地方。
就我个人而言,实现它的方式是有一个包含所有可能选项的"master"下拉列表,只是为了缓存。然后在每个"从属"下拉列表中复制这些选项。每当更改任何从属下拉列表时,都会重新填充它们,以确保没有两个下拉列表可以共享相同的选定值。
出于演示的目的,我在下面的代码中只使用了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>
希望能有所帮助。
执行所需操作的最简单方法是在下拉列表中的select事件中绑定一个函数,该函数可从所有其他下拉列表中筛选内容,并删除或禁用已选择值的选项。
要保持列表中的顺序,请将选项列表缓存在数组中,然后可以删除并添加到正确的位置,或者删除所有选项并重新添加当前可能的选项。
如果您想重新选择缓存的已选择选项,并且不会丢失任何内容。
- 在一组复选框中,一次只允许选择一个
- 为什么在fabricjs中可选择的不适用于一组圆
- Jquery从javascript中选择了一组选定的值
- 使用jQuery可以根据数字选择一组同级
- 如何创建一组从属选择列表,其中连续列表依赖于前面列表选项的选择
- 我想将一组jquery选择器存储为要延迟评估的数据结构
- 我如何创建一个函数来选择一组复选框的子集
- 如何使用 JavaScript 函数选择和修改一组 html
- Javascript函数,用于记住用户在其先前的访问权限中从一组下拉菜单选项中选择的内容
- 选择一组三里并将它们显示在下一个或上一个按钮上
- 有没有一种方法可以只允许在一组按钮中选择一个按钮
- 每次重新加载我的网站时,从阵列中随机选择一组6个不同的图像
- 使用Javascript维护一组选择下拉列表
- Angularjs用另一个数组选择ng-options的默认值
- 当选择相应的复选框发送值spring-mvc控制器时,使用jQuery从一组html元素中获取值
- 选择一组元素的最有效方法
- 在Apex表格中选择一组复选框(使用jQuery)
- 如果一组下拉列表中的任何下拉列表值与其他下拉列表选择的值相等,则应删除整个其他下拉列表
- 从一组jQuery元素中选择单个元素
- 如何一次选择数组中的所有项目,并为它们添加类