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

问题描述 投票:0回答:1

我试图弄清楚如何使用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 (i.e. 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) {上犯一些错误但我不明白如何使这部分变得更好。

非常感谢。

javascript dropdown
1个回答
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);将找到具有与新值相似的值的选择。如果找到键!= -1,请使用oldValue更新该选择。
  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 (i.e. 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>
© www.soinside.com 2019 - 2024. All rights reserved.