简体   繁体   English

如何防止 Select 元素具有重复选项

[英]How to prevent Select elements from having duplicating options

I am making a calendar page where users can select any day of the week but the options must not duplicate what is already selected in other ones.我正在制作一个日历页面,用户可以在一周中的任何一天 select 但选项不能与其他选项中已经选择的内容重复。

Check below to see what I mean:检查下面以了解我的意思:

 var elementOption = ["--", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday"] function update(element) { //do something, IDK }
 <h4>How can we prevent selected option in A from showing in options B and C, and vice versa?</h4> <div> <h5> A </h5> <select name="day_select" onchange="update(this)"> <option value="--">--</option> <option value="monday">Monday</option> <option value="tuesday">Tuesday</option> <option value="wednesday">Wednesday</option> <option value="thursday">Thursday</option> <option value="friday">Friday</option> <option value="saturday">Saturday</option> <option value="sunday">Sunday</option> </select> </div> <div> <h5> B </h5> <select name="day_select" onchange="update(this)"> <option value="--">--</option> <option value="monday">Monday</option> <option value="tuesday">Tuesday</option> <option value="wednesday">Wednesday</option> <option value="thursday">Thursday</option> <option value="friday">Friday</option> <option value="saturday">Saturday</option> <option value="sunday">Sunday</option> </select> </div> <h5> C </h5> <select name="day_select" onchange="update(this)"> <option value="--">--</option> <option value="monday">Monday</option> <option value="tuesday">Tuesday</option> <option value="wednesday">Wednesday</option> <option value="thursday">Thursday</option> <option value="friday">Friday</option> <option value="saturday">Saturday</option> <option value="sunday">Sunday</option> </select> </div>

My question: How can we do it without using Jquery or many nested For loops (as performance is key here too).我的问题:我们如何在不使用 Jquery 或许多嵌套的 For 循环的情况下做到这一点(因为这里的性能也是关键)。 Thank you谢谢

Here is a rough solution showing the dynamics in VanillaJS这是一个粗略的解决方案,显示了 VanillaJS 中的动态

https://jsfiddle.net/e5zhymwL/17/ https://jsfiddle.net/e5zhymwL/17/

 const options = [ "--", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday", ] const daysSelected = [] const selectedListBox = document.getElementById('selected') function update(elem, targetId) { const selected = elem.value if (selected === '--') return daysSelected.push(selected) // print out already selected days const otherSelector = document.getElementById(targetId) // replace the targeted selector with available options otherSelector.innerHTML = '' otherSelector.insertAdjacentHTML( 'beforeend', options.filter(option => daysSelected.indexOf(option) === -1).map(option => `<option value="${option}">${option}</option>`) ) selectedListBox.innerHTML = daysSelected } const reset = () => { daysSelected.length = 0; [document.getElementById('selector1'), document.getElementById('selector2')].forEach(elem => { elem.innerHTML = '' elem.insertAdjacentHTML( 'beforeend', options.filter(option => daysSelected.indexOf(option) === -1).map(option => `<option value="${option}">${option}</option>`) ) }) selectedListBox.innerHTML = '' }
 <h4>Non-duplicating for each of these</h4> <select name="day_select_1" id="selector1" onchange="update(this,'selector2')"> <option value="--">--</option> <option value="monday">Monday</option> <option value="tuesday">Tuesday</option> <option value="wednesday">Wednesday</option> <option value="thursday">Thursday</option> <option value="friday">Friday</option> <option value="saturday">Saturday</option> <option value="sunday">Sunday</option> </select> <select name="day_select_2" id="selector2" onchange="update(this,'selector1')"> <option value="--">--</option> <option value="monday">Monday</option> <option value="tuesday">Tuesday</option> <option value="wednesday">Wednesday</option> <option value="thursday">Thursday</option> <option value="friday">Friday</option> <option value="saturday">Saturday</option> <option value="sunday">Sunday</option> </select> <p>Selected days: <span id="selected"></span></p> <button onclick="reset()">Reset</button>

You will need to refactor and clean up a little the code (global scoping and duplications).您将需要重构和清理一些代码(全局范围和重复)。 However, following this you should be able to improve it a little and generate dynamically more days selectors.但是,在此之后,您应该能够对其进行一些改进并动态生成更多天数选择器。 Hope it could help!希望它可以帮助!

UPDATE更新

New jsfiddle => https://jsfiddle.net/knopfy/vqnrtzdf/33/新的 jsfiddle => https://jsfiddle.net/knopfy/vqnrtzdf/33/

 const options = [ "--", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday", ] const selectors = { A: document.getElementById('A'), B: document.getElementById('B'), C: document.getElementById('C'), } const daysSelected = {} function update(elem) { const selector = elem.id const selected = elem.value if (selected === '--') { return } daysSelected[selector] = selected for (const key in selectors) { if (key.== selector) { for (const option of selectors[key].options) { option.disabled = daysSelected[key].== option.value && Object.values(daysSelected).indexOf(option.value) !== -1 } } } }
 <select name="A" id="A" onchange="update(this)"> <option value="--">--</option> <option value="monday">Monday</option> <option value="tuesday">Tuesday</option> <option value="wednesday">Wednesday</option> <option value="thursday">Thursday</option> <option value="friday">Friday</option> <option value="saturday">Saturday</option> <option value="sunday">Sunday</option> </select> <select name="B" id="B" onchange="update(this)"> <option value="--">--</option> <option value="monday">Monday</option> <option value="tuesday">Tuesday</option> <option value="wednesday">Wednesday</option> <option value="thursday">Thursday</option> <option value="friday">Friday</option> <option value="saturday">Saturday</option> <option value="sunday">Sunday</option> </select> <select name="C" id="C" onchange="update(this)"> <option value="--">--</option> <option value="monday">Monday</option> <option value="tuesday">Tuesday</option> <option value="wednesday">Wednesday</option> <option value="thursday">Thursday</option> <option value="friday">Friday</option> <option value="saturday">Saturday</option> <option value="sunday">Sunday</option> </select>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM