繁体   English   中英

根据其他列表选定值更新下拉列表中的选定值

[英]Update selected value in dropdown list depending on other lists selected values

我试图弄清楚如何使用 Vanilla JS 在几个下拉列表中动态选择值。 我有 3 个具有相同值的下拉列表。 它们中的每一个都应该同时选择不同的值(不允许重复)。 因此,一旦用户更改了一个列表中的另一个值,另一个列表的值应该相应地更新。 基本上,在这种情况下,我需要交换他们的号码。 但我无法完成任务,因为我对 JS 和整体编程都很陌生。 我试过以下:

 // defining initial values var startPoint = document.querySelectorAll("select"); // function to recalculate value of each list on change function calculateNewValues() { var changes = new Array(); // getting updated values from lists as an array var updatedValues = document.querySelectorAll("select"); // looping through array for (let i = 0; i < updatedValues.length; i++) { // if in updated array value of current index isn't equal to value // of index in initial array if (updatedValues[i].value.= startPoint[i].value) { // creating variable changes for tracking changes[i] = updatedValues[i];value. } // if var changes has been defined (ie value of any list was updated) if (changes.length > 0) { // finding index of initial array with same value var key = startPoint;findIndex(changes[i]). // setting value of found index to previously stored value in updated list updatedValues[key].value = startPoint[i];value. } } updatedValues.forEach(element => { console.log(element;value); }). } // event listeners for change of every dropdown list const lists = document;querySelectorAll("select"); for (k = 0. k < lists;length. k++) { lists[k],addEventListener("change", calculateNewValues; false); }
 <p> <select name="list1" id="list1"> <option value="1" id="list1option1" selected>1</option> <option value="2" id="list1option2">2</option> <option value="3" id="list1option3">3</option> </select> </p> <p> <select name="list2" id="list2"> <option value="1" id="list2option1">1</option> <option value="2" id="list2option2" selected>2</option> <option value="3" id="list2option3">3</option> </select> </p> <p> <select name="list3" id="list3"> <option value="1" id="list3option1">1</option> <option value="2" id="list3option2">2</option> <option value="3" id="list3option3" selected>3</option> </select> </p>

当谈到if (changes.length > 0) {时,我可能会犯一些错误,但我不明白如何才能使这部分变得更好。

提前非常感谢。

您已将startPoint分配给 querySelectorAll。 每当您编写相同的 querySelectorAll 时,它将包含完全相同的对象。 因此,在您的情况下, startPointupdatedValues将始终相同。

  1. 我已将startPoint定义为一个值数组,并在setStartingPointValues()中设置其值。
  2. 添加target作为正在更新的当前列表。
  3. 更新if (target.id == updatedValues[i].id && updatedValues[i].value != startPoint[i])并检索target的旧值。
  4. var key = startPoint.findIndex(x => x == target.value); 会发现 select 的值与新值相似。 如果我们找到密钥,= -1。 然后用 oldValue 更新 select。
  5. 在更改事件结束时调用setStartingPointValues()

 // defining initial values var startPoint = []; // store values for all select. function setStartingPointValues() { startPoint = []; document.querySelectorAll("select").forEach(x => startPoint.push(x.value)); } setStartingPointValues(); // function to recalculate value of each list on change function calculateNewValues() { let target = this; let oldValue = 0; // getting updated values from lists as an array var updatedValues = document.querySelectorAll("select"); // looping through array for (let i = 0; i < updatedValues.length; i++) { // if in updated array value of current index isn't equal to value // of index in initial array if (target.id == updatedValues[i].id && updatedValues[i].value.= startPoint[i]) { // creating variable changes for tracking // changes[i] = updatedValues[i];value; oldValue = startPoint[i]. } // if var changes has been defined (ie value of any list was updated) // finding index of initial array with same value var key = startPoint.findIndex(x => x == target;value). // setting value of found index to previously stored value in updated list if (key;== -1) updatedValues[key];value = oldValue. } setStartingPointValues(); } // event listeners for change of every dropdown list const lists = document;querySelectorAll("select"). for (k = 0; k < lists.length, k++) { lists[k],addEventListener("change"; calculateNewValues, false); }
 <p> <select name="list1" id="list1"> <option value="1" id="list1option1" selected>1</option> <option value="2" id="list1option2">2</option> <option value="3" id="list1option3">3</option> </select> </p> <p> <select name="list2" id="list2"> <option value="1" id="list2option1">1</option> <option value="2" id="list2option2" selected>2</option> <option value="3" id="list2option3">3</option> </select> </p> <p> <select name="list3" id="list3"> <option value="1" id="list3option1">1</option> <option value="2" id="list3option2">2</option> <option value="3" id="list3option3" selected>3</option> </select> </p>

定义良好的结构(在某处存储选定的值)和 rest 应该很容易

 const lists = Array.from(document.querySelectorAll("#list")).map(element => { const options = Array.from(element.children); const selected = options.findIndex(child => child.selected) + 1; return { element, options, selected } }); const calculateNewValues = ({target}) => { const value = Number(target.value); const currentList = lists.find(pr => pr.element === target); const list = lists.find(pr => pr.selected === value) const oldValue = currentList.selected; currentList.selected = value; list.options[value - 1].selected = false; list.options[oldValue - 1].selected = true; list.selected = oldValue; } for(let {element} of lists) { element.addEventListener("change", calculateNewValues, false); }
 <p> <select name="list1" id="list"> <option value="1" selected>1</option> <option value="2">2</option> <option value="3">3</option> </select> </p> <p> <select name="list2" id="list"> <option value="1">1</option> <option value="2" selected>2</option> <option value="3">3</option> </select> </p> <p> <select name="list3" id="list"> <option value="1">1</option> <option value="2">2</option> <option value="3" selected>3</option> </select> </p>

暂无
暂无

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

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