我遇到这种情况:
2 Multi选择具有相同数量的选项和相同的值:
<select id="first" name="first" multiple>
<option value="1" id="1">First</option>
<option value="2" id="2">Second</option>
<option value="3" id="3">Third</option>
</select>
<select id="second" name="second" multiple>
<option value="1" id="1">First</option>
<option value="2" id="2">Second</option>
<option value="3" id="3">Third</option>
</select>
如果我选择第一个中的元素,我必须在第二个中禁用。如果我取消选择第一个元素,我必须在第二个元素中激活(不选择)它。 第二次选择的情况相同。
我该怎么做?
提前致谢。
答案 0 :(得分:0)
实现起来应该是微不足道的。
到目前为止你尝试了什么?
粗略概述:
将函数绑定到每个选择字段上的change事件,并创建一个函数以根据第一个选择的值更新另一个下拉列表。根据您正在进行的操作,如果用户禁用了javascript,也可以建议进行服务器端验证。
答案 1 :(得分:0)
$("#first, #second").change(function(){
var index;
for (var i = 0; i < $(this).find("option").length; i++){
if ($(this).find("option").eq(i).attr("selected") == true){
index = i;
break;
}
}
if (index){
var target = ($(this).attr("id") == "first") ? $("#second) : $("#first");
$(target).find("option").eq(index).attr("disabled", true);
}
}
答案 2 :(得分:0)
您必须拥有唯一ID。我建议使用类而不是ID,例如class="opt1"
等...
关于jQuery行为,试试这个:
var $select = $('select');
$select.on('change', function () {
$select.find('option').attr('disabled', false);
var selectedValue = this.value;
$('select').not(this).find('option').filter(function () {
return this.value == selectedValue
}).attr("disabled", "disabled");
});
答案 3 :(得分:0)
<select id="first" name="first" multiple onchange="selectedItem(this, this.value)">
<option value="1" id="1">First</option>
<option value="2" id="2">Second</option>
<option value="3" id="3">Third</option>
</select>
<select id="second" name="second" multiple onchange="selectedItem(this, this.value)">
<option value="1" id="1">First</option>
<option value="2" id="2">Second</option>
<option value="3" id="3">Third</option>
</select>
<script>
function selectedItem(dropdown, value) {
var changed = (dropdown.id == 'first') ? 'second' : 'first';
if (value == '') {
document.getElementById(changed).disabled = false;
} else {
document.getElementById(changed).disabled = true;
}
}
</script>
答案 4 :(得分:0)
给两个元素一个类,例如mutual-exclude
。然后:
$(".mutual-exclude").change(function () {
var $other = $(".mutual-exclude").not(this);
$(this).children("option").each(function () {
$other.find("[value='" + this.value + "']").prop('disabled', this.selected);
});
});
答案 5 :(得分:0)
用另一种纯DOM溶液将帽子扔进戒指。我想这就是你想要做的。 。 ?
给出提供的HTML(并更改id以使其有效:))
<select id="first" name="first" multiple="true" onchange="toggle();">
<option value="1" id="1a">First</option>
<option value="2" id="2a">Second</option>
<option value="3" id="3a">Third</option>
</select>
<select id="second" name="second" multiple="true" onchange="toggle();">
<option value="1" id="1b">First</option>
<option value="2" id="2b">Second</option>
<option value="3" id="3b">Third</option>
</select>
function toggle() {
var a = document.getElementById("first").options;
var b = document.getElementById("second").options;
for (var i = 0; i < a.length; i++) {
b[i].disabled = a[i].selected;
a[i].disabled = b[i].selected;
}
}
答案 6 :(得分:0)
这是“纯javascript”解决方案(也适用于jQuery)。只需将其放入卸载处理程序并完成。
// Find the selectboxes
var first = document.getElementById("first");
var second = document.getElementById("second");
function attach(source, target) {
source.onchange = function (e) { // Subsribe to the onchange event
target.value = ""; // Disable the selection in the other selectbox
for (var i = 0; i < source.children.length; i++) { // Loop over all the options
// Enable all the options for the source selectbox
source.children[i].disabled = false;
// Disable the selected source option (if any) on the target side
target.children[i].disabled = i === (source.value && (parseInt(source.value, 10) - 1));
}
};
}
// Bind both selectboxes to each other
attach(first, second);
attach(second, first);
要查看实际情况,请查看 JSFiddle demo 。