【问题标题】:How to populate select options from an array based on a select value?如何根据选择值从数组中填充选择选项?
【发布时间】:2017-12-12 05:00:55
【问题描述】:

尝试根据第一个选择元素的值从数组中填充第二个选择元素的选项。我似乎无法理解为什么它只填充第一个选择元素的数组中的项目。我知道 appendChild 导致项目继续满足需要,但我试图清除变量,但似乎创建的选项元素仍然存在。

任何帮助都会很棒,谢谢!

<select id="makeSelect" onChange="modelAppend()">
    <option value="merc">Mercedes</option>
    <option value="audi">Audi</option>
    <option value="bmw">BMW</option>
</select>

<select id="modelSelect">

</select>

<script>
var audiModels = ["TT", "R8", "A4", "A6"]; //audimodels
var mercModels = ["C230", "B28", "LTX",]; //mercmodels
var bmwModels = ["328", "355", "458i",]; //bmwmodels
var selectedMake = document.getElementById("makeSelect"); //grabs the make select
var selectedModel = document.getElementById("modelSelect"); //grabs the model select
var appendedModel = window[selectedMake.value + "Models"]; // appends "Models" to selectedMake.value and converts string into variable

function modelAppend() {
    for (var i = 0; i < appendedModel.length; i ++) { // counts items in model array
        var models = appendedModel[i]; // // sets "models" to count of model array
        var modelOptions = document.createElement("option"); //create the <option> tag
        modelOptions.textContent = models; // assigns text to option
        modelOptions.value = models; // assigns value to option
        selectedModel.appendChild(modelOptions); //appeneds option tag with text and value to "modelSelect" element
    }
}

</script>

【问题讨论】:

  • 如何编辑您的问题并正确缩进您的代码?
  • 这个变量 'appendedModel' 需要在函数内部刷新以获取新的 selectedMake 值
  • @ScottMarcus 如何提供适当的反馈并推荐介绍缩进最佳实践的文档?
  • @S.Morrison 这就是谷歌的目的。我的反馈绝对合适。如果您需要程序员的编程帮助,您有责任提出用基本标准编写的问题,以便您的问题易于阅读和理解。代码缩进实际上是“101”的东西。你问题的文字暗示你对编码有一定的了解,所以要求你这样做是完全合适的。
  • 我知道你现在从哪里来,我知道为什么会这样。我认为这里的误解来自“您的问题文本暗示您对编码有一定的了解”以及我对提问前应遵循哪些准则的理解。

标签: javascript arrays select var


【解决方案1】:

这条线很可疑:

var appendedModel = window[selectedMake.value + "Models"];

您需要在值更改时获取元素,而不是在页面加载时获取。然后您还需要删除更改选项,否则如果用户多次选择,您将获得一个很长的列表。使用对象来存储数组,这使得以后访问它们变得更加容易。最好使用事件监听器而不是内联 js(尽管这不是这里的主要问题)。

试试下面的代码:

let models = {
  audiModels: ["TT", "R8", "A4", "A6"],
  mercModels: ["C230", "B28", "LTX"],
  bmwModels: ["328", "355", "458i"]
}

document.getElementById('makeSelect').addEventListener('change', e => {
  let el = e.target;
  let val = el.value + 'Models';
  let appendTo = document.getElementById('modelSelect');
  Array.from(appendTo.getElementsByTagName('option')).forEach(c => appendTo.removeChild(c));
  if (!models[val] || !Array.isArray(models[val])) {
    appendTo.style.display = 'none';
    return;
  }
  models[val].forEach(m => {
    let opt = document.createElement('option');
    opt.textContent = opt.value = m;
    appendTo.appendChild(opt);
  });
  appendTo.style.display = '';
});
<select id="makeSelect">
    <option value=""></option>
    <option value="merc">Mercedes</option>
    <option value="audi">Audi</option>
    <option value="bmw">BMW</option>
</select>

<select id="modelSelect" style="display:none">

</select>

【讨论】:

  • 太棒了,这不仅可以回答我的问题,还可以将我推向最佳实践的方向。非常感谢!
  • 不客气@S.Morrison。如果您需要解释这些线条的作用,请告诉我。如果对您有帮助,请将答案标记为已接受。
  • 在查看完这篇文章后,我对 e => { ... ... ... return; 发生了什么感到有些困惑。 } 功能。我知道您正在获取 ID 为“makeSelect”的元素并添加一个事件侦听器来执行“makeSelect”元素发生更改时包含的函数,但为什么 e => 是计算“makeSelect”中包含的值?之后你对函数中的变量 m 做同样的事情吗?
  • 不是@S.Morrison,这只是一个arrow function。在这种情况下,它的作用与function(e) {... ... ... return;} 相同
  • @S.Morrison e 在这两种情况下都是相同的,即 change 事件。我抓住用e.target 改变makeSelect 的元素。 m 是数组的一个元素,一个接一个,就像它在 forEach 中一样,例如TT 代表奥迪 -> TT
猜你喜欢
  • 1970-01-01
  • 2012-12-24
  • 2021-09-29
  • 2020-06-24
  • 1970-01-01
  • 2016-11-07
  • 2023-03-29
  • 2023-01-25
  • 2020-07-31
相关资源
最近更新 更多