我有多个具有相同选项的下拉菜单。如果选择了一个选项,则其他下拉菜单将不会显示所选选项。当我尝试重置所选选项时,它没有恢复删除的选择选项。
HTML部分:
<select id="selectNumber" class="selectbox">
<option value="0">Choose a number</option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
</select>
<select id="selectNumber2" class="selectbox">
<option value="0">Choose a number</option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
</select>
Javascript部分:
$(".selectbox").change(function(){
var selectedIndex = $(this).index();
var myVal = $(this).val();
$(".selectbox").each(function(i){
if (selectedIndex != i){
$("option", this).each(function(){
if (myVal == $(this).val() && myVal != 0){
$(this).detach();
}else{
$(this).prepend();
//not work
}
});
}
});
});
感谢您的时间。
答案 0 :(得分:0)
执行detach()时,对象将被删除,需要放入&#34; global&#34;变量保存为引用。 出于您的目的,您可以使用.hide()和.show(),因为它会保留列表中的对象,而不会导致DOM插入或删除(因此性能更好)。
答案 1 :(得分:0)
嗯,您当前的代码不起作用,因为您没有将选定的值存储在另一个下拉列表中。此外,与其他人一样,请使用hide
和show
代替detach
和prepend
。
您可以在jsfiddle(在Firefox中测试)
中查看我的解决方案答案 2 :(得分:0)
这应该做你想要的事情
/* store options */
var $selects = $(".selectbox");
var $opts = $selects.first().children().clone();
$selects.change(function () {
var myVal = $(this).val();
if (myVal !='0') {
$selects.not(this).children('[value="'+myVal+'"]').remove();
}else{
var replaceVal=$(this).data('currVal');
$selects.not(this).append( $opts.filter( '[value="'+replaceVal+'"]').clone())
}
$(this).data('currVal', myVal);
});
DEMO http://jsfiddle.net/7Ssu7/8/
编辑版本 - 保持排序顺序
/* store options */
var $selects = $(".selectbox");
var $opts = $selects.first().children().clone();
$selects.change(function () {
/*create array of all selected values*/
var selectedValues=$selects.map(function(){
var val=$(this).val();
return val !=0? val :null;
}).get();
$selects.not(this).each(function(){
var $sel=$(this), myVal=$sel.val() ||0;
var $options=$opts.clone().filter(function(i){
var val=$(this).val();
return val==myVal || $.inArray(val, selectedValues) ==-1;
});
$sel.html( $options).val( myVal)
});
});