HTML表格
第1行:第1列 [
Country DropDown
] | Col#2 [StateDropDown
]第2行:第1列 [
Country DropDown
] | 第2栏 [StateDropDown
]
表格有2 dropdownlists
,Country
& State
- 这适用于一个下拉列表,但它也会禁用其他/州下拉列表!
问题是,虽然两者美国和Aust都有diff states selected
文字,但在col2
结束时相同选择了State
ID / value 3
(如果我选择加利福尼亚州,珀斯也被禁用了!因此我的代码禁用它们作为重复项,因为它比较选定的值而不是文本)例如这个选择禁用了珀斯..
[USA] -> [California] (value = 3)
[Australia] -> [Perth] (*also* has value= 3) so its disabled
如何以unique combination
国家和地区的身份执行此操作每一行的状态?或者只是比较下拉菜单的文本?...
Country ID + State ID Value already exist
?// Javascript Does not disable States previously selected
$("#CountryTable").on('change', '.State', function() {
var dropDownText = $('#CountryTable .State select').not(this).map(function() {
return this.SelectedText; // does not work this.val() works but useless
}).get();
var selectedValue = $(this).val();
var otherDropdowns = $('.State').not(this);
otherDropdowns.find('option [value ='+ selectedValue +']')。prop('disabled',true); });
<table id="CountryTable">
<tbody id="CountryTableBody">
<tr class="row">
<td>
<select>
<option value="1">Country A</option>
<option value="2">Country B</option>
<option value="3">Country C</option>
</select>
</td>
<td>
<select>
<option value="1">State 1</option>
<option value="2">State 2</option>
<option value="3">State 3</option>
<option value="4">State 4</option>
<option value="5">State 5</option>
</select>
</td>
<tr> <!-- in JS prevent previous selection -->
<tr class="row">
<td>
<select>
<option value="1">Country A</option>
<option value="2">Country B</option>
<option value="3">Country C</option>
</select>
</td>
<td>
<select>
<option value="1">State 1</option>
<option value="2">State 2</option>
<option value="3">State 3</option>
<option value="4">State 4</option>
<option value="5">State 5</option>
</select>
</td>
<tr>
</tbody>
***图片显示类似的内容 ...不准确
答案 0 :(得分:2)
这不是一个完美的解决方案,你可以复制/粘贴,但它真正接近你想要的。
我用4个参数作为一个整体函数:
table
,最好是id
td
,最好是class
table
,最好是id
button
,最好是id
让您自由地在HTML中为自己想要的东西命名,而不是在修复脚本中使用这些4的MULTIPLE位置。
现在......这只是一个好的开始。
实际上,当用户从&#34;国家A&#34;到#B;国家B&#34;,州下拉列表应该是不同的!
这是我离开的唯一问题...因为我不知道你想如何加载这些选项。
我花了很多时间辞职......我这样做是因为我无法相信这样一个简单的&#34;请求可能是那么复杂......我不得不粉碎它 ;)
所以这里是代码(仅限JS)和工作CodePen演示。
var excusiveSelect = function(tableID,rowCLASS,dummyID,cloneBtn){ // Preferably ID, CLASS, ID, ID
console.clear();
// Cloning function
var cloneRow = function(){
var newrow = $(dummyID).find(rowCLASS).clone();
$(tableID).append(newrow);
refresh_mapping();
};
// Generate new lines
$(cloneBtn).on("click",cloneRow);
// ================================================================================ INITIALISATION
// Selection mapping
var row_count;
var row_map = {};
// Get select clas names per colums
var col_count = $(rowCLASS).first().find("td").length;
var col_classes = [];
for(i=0;i<col_count;i++){
col_classes[i] = $(document).find(rowCLASS).first().find("select").eq(i).attr("class").split(" ").join(".");
}
console.log("SELECT CLASSES: "+JSON.stringify(col_classes));
var refresh_mapping = function(){
row_count = $(document).find(rowCLASS).length-1;
console.log("ROWCOUNT: "+row_count);
for(i=0;i<row_count;i++){
row_map["row_"+i] = {};
$(tableID).find(rowCLASS).eq(i).find("select").each(function(index){
// Get the select classes as object attribute.
var thisClasses = $(this).attr("class").split(" ").join(".");
// For each row/select get the selected index.
row_map["row_"+i][thisClasses] = $(this)[0].selectedIndex;
});
}
console.log("VALUES MAPPING: "+JSON.stringify(row_map));
}
cloneRow();
// ================================================================================ FROM COLUMN #1
$(document).on("change","."+col_classes[0],function(){
console.log("\n======================================================= Country change\n");
refresh_mapping();
// Disables options already selected in ALL col_classes[1] where col_classes[0] is the same
for(i=0;i<row_count;i++){
if( ( row_map["row_"+i][col_classes[0]] == $(this)[0].selectedIndex )
&& ( $(this).closest(rowCLASS).index() != i ) ){
$(this).closest(rowCLASS).find("."+col_classes[1]+" option").eq( row_map["row_"+i][col_classes[1]] ).attr("disabled",true);
// Else enable the option if not self
}else{
if( $(this).closest(rowCLASS).index() != i ){
$(this).closest(rowCLASS).find("."+col_classes[1]+" option").eq(i).attr("disabled",false);
}
}
}
});
// ================================================================================ FROM COLUMN #2
$(document).on("change","."+col_classes[1],function(){
console.log("\n======================================================= State change\n");
console.clear();
refresh_mapping();
thisIndex = $(this)[0].selectedIndex; // Option selectedIndex
thisRowIndex = $(this).closest(rowCLASS).index(); // Row index
// If same country...
var thisCol0index = $(this).closest(rowCLASS).find("."+col_classes[0])[0].selectedIndex;
$(tableID).find("."+col_classes[1]).each(function(){
if( $(this).closest(rowCLASS).find("."+col_classes[0])[0].selectedIndex == thisCol0index ){
// Zap tout les disabled
$(this).find("option:not(:eq(0))").attr("disabled",false);
// Use mapping to disable based on col_classes[0]
for(i=0;i<row_count;i++){
if( row_map["row_"+i][col_classes[0]] == thisCol0index ){
$(this).find("option").eq(row_map["row_"+i][col_classes[1]]).attr("disabled",true);
}
}
}
});
});
// ================================================================================
}
// Init!
excusiveSelect("#CountryTable",".row","#DummyTable","#newRow"); // Preferably ID, CLASS, ID, ID