2017-05-04 43 views
0

我有一個<form>多對<select>'s都使用相同的<option>'s集,但我想確保用戶不會選擇任何對的同一組選項。任何給定對中選擇的組合值不應該用於其他地方。對可以動態添加或刪除,如果任何2對相同,他們就不能提交表單。 A1 & B1是一對,A2 & B2是一對,依此類推。至於何時檢查,我認爲提交將是最好的。檢測和/或防止重複的選擇值

我採取這種方法之前,我意識到這是做這件事的可怕的方式...

var selects = []; 

$('#col1 select').each(function(){ 
    var index = $(this).parent().attr('id').substring(1); 
    var value1 = this.value; 
    var value2 = $('#b' + index + ' select').val(); 
    var entry = value1+value2; 
    selects.push(entry); 
}); 

// loop through selects looking for duplicates 

這裏是有問題的HTML ...

* { 
 
    box-sizing: border-box; } 
 
    
 
#column1, 
 
#column2 { 
 
    display: inline-block; 
 
    vertical-align:top; 
 
    width: 49%;} 
 
    
 
#column1 div, 
 
#column2 div { 
 
    display:block; 
 
    width:100%; 
 
    margin-bottom: 10px; 
 
    padding-bottom: 10px; 
 
    border-bottom: 1px solid black;}
<div id="column1"> 
 
    <div id="a1"> 
 
    <select> 
 
     <option value="1">1</option> 
 
     <option value="2">2</option> 
 
     <option value="3">3</option> 
 
    </select> 
 
    </div> 
 
    <div id="a2"> 
 
    <select> 
 
     <option value="1">1</option> 
 
     <option value="2">2</option> 
 
     <option value="3">3</option> 
 
    </select> 
 
    </div> 
 
    <div id="a3"> 
 
    <select> 
 
     <option value="1">1</option> 
 
     <option value="2">2</option> 
 
     <option value="3">3</option> 
 
    </select> 
 
    </div> 
 
</div> 
 

 
<div id="column2"> 
 
    <div id="b1"> 
 
    <select> 
 
     <option value="alpha">alpha</option> 
 
     <option value="bravo">bravo</option> 
 
     <option value="charlie">charlie</option> 
 
    </select> 
 
    </div> 
 
    <div id="b2"> 
 
    <select> 
 
     <option value="alpha">alpha</option> 
 
     <option value="bravo">bravo</option> 
 
     <option value="charlie">charlie</option> 
 
    </select> 
 
    </div> 
 
    <div id="b3"> 
 
    <select> 
 
     <option value="alpha">alpha</option> 
 
     <option value="bravo">bravo</option> 
 
     <option value="charlie">charlie</option> 
 
    </select> 
 
    </div> 
 
</div>

+1

爲什麼不使用單選按鈕和他們的風格作爲一個列表?更好的解決方案,如果Javascript和CSS被禁用(不太可能,但它可能)。 –

+0

就這樣我很清楚;如果選擇'a1 - > value1',則不能選擇'a2 - > value1',只有'a2 - > value2'是可選的。類似的b。那是對的嗎? – Sasang

+1

@Waxi請使用[Stack Snippets](https://stackoverflow.blog/2014/09/introducing-runnable-javascript-css-and-html-code-snippets/)代替jsfiddle。 – Barmar

回答

0

使用類別來表示集合。然後,您可以更一般地遍歷集合,作爲列和行,而不是通過ID。

function getPairs(){ 
 
var pairs = []; 
 
var cols = $('.col'); 
 
var rows = $('.row',cols[0]); 
 
//iterate through row i of each column 
 
for(var r = 0; r < rows.length; r++){ 
 
    var val = ""; 
 
    for(var c = 0; c < cols.length; c++){ 
 
     val += $('.row select',cols[c])[r].value; 
 
    } 
 
    pairs.push(val); 
 
} 
 
return pairs; 
 
} 
 

 
$("#btn").click(function(){ 
 
    console.log(getPairs()); 
 
}); 
 
//console.log(getPairs());
* { box-sizing: border-box;} 
 

 
/* hack to fix console overlapping content of snippet result*/ 
 
div.as-console-wrapper { position: initial; } 
 

 
.col { 
 
    display: inline-block; 
 
    width: 49%; 
 
    vertical-align:top;} 
 
    
 
.row { 
 
    display: block; 
 
    width: 100%; 
 
    margin-bottom: 10px; 
 
    padding-bottom: 10px; 
 
    border-bottom: 1px solid black;} 
 
    
 
select, 
 
option { 
 
    display: block; 
 
    width: 100%:}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 

 
<div id="column1" class="col"> 
 
    <div id="a1" class="row"> 
 
    <select> 
 
     <option value="1">1</option> 
 
     <option value="2">2</option> 
 
    </select> 
 
    </div> 
 
    <div id="a2" class="row"> 
 
    <select> 
 
     <option value="1">1</option> 
 
     <option value="2">2</option> 
 
    </select> 
 
    </div> 
 
    <div id="a3" class="row"> 
 
    <select> 
 
     <option value="1">1</option> 
 
     <option value="2">2</option> 
 
    </select> 
 
    </div> 
 
</div> 
 
<div id="column2" class="col"> 
 
    <div id="b1" class="row"> 
 
    <select> 
 
     <option value="alpha">alpha</option> 
 
     <option value="bravo">bravo</option> 
 
    </select> 
 
    </div> 
 
    <div id="b2" class="row"> 
 
    <select> 
 
     <option value="alpha">alpha</option> 
 
     <option value="bravo">bravo</option> 
 
    </select> 
 
    </div> 
 
    <div id="b3" class="row"> 
 
    <select> 
 
     <option value="alpha">alpha</option> 
 
     <option value="bravo">bravo</option> 
 
    </select> 
 
    </div> 
 
</div> 
 

 
<p><input type="button" id="btn" value="Log Result" /></p>

+0

控制檯顯然是在這裏的方式。有一個它隱藏的按鈕= /我將刪除初始的console.log()調用。請記住控制檯會在點擊後覆蓋它,這是糟糕的設計,但它是Stack Overflow的一個特性,而不是這個答案本身。 –

+0

如果您傾向於篩選重複項,則可以在getPairs函數中簡單地將'pairs.push(val);'擴展爲'if(pairs.indexOf(val)> -1)'以確定重複項。 –

+0

是的,你的方法比嘗試管理ID更好,我可以根據需要修改它,現在我明白你是如何做到的,謝謝。 – Slime