javascript - 根据选择填充下拉列表

标签 javascript jquery html

我选择了“年份”和“品牌”,并且我只想填充与年份相关的品牌。我目前可以填充 fitmentData.json 中的所有数据,但是当我尝试过滤我的选择时,我无法找到让它工作的方法。目前我有一个 updateMake() 函数,我相信它可以工作,但是在黑客攻击了大约 2 小时后,我无法得到解决方案。

html

  <select name="year" id="year">

  </select>

  <select id="make" name="make">

  </select>
  <select id="model" name="model">

  </select>

js

 //year
    let yearDropdown = $('#year');
    yearDropdown.append('<option selected="true" disabled>Choose     
Year</option>');

    //make(brand in json)
    let brandDropdown = $('#make');
    brandDropdown.append('<option selected="true" disabled>Choose  
Make</option>');

    const url = 'fitmentData.json';

    //append json years in dropdown
    $.getJSON(url, function (data) {
      $.each(data, function (key, entry) {
        yearDropdown.append($('<option></option>').attr('value',  
entry.year).text(entry.year));
      })
      //remove year duplicates
      var map = {}
      $('select option').each(function () {
        if (map[this.value]) {
          $(this).remove()
        }
        map[this.value] = true;
      })
      //append json makes in dropdown
      $.each(data, function (key, entry) {
        brandDropdown.append($('<option></option>').attr('value',  
entry.brand).text(entry.brand));
        updateMake();
      });
      //remove make duplicates
      var map = {}
      $('select option').each(function () {
        if (map[this.value]) {
          $(this).remove()
        }
        map[this.value] = true;
      })

    //updates makes depending on selection
    function updateMake() {
      brandDropdown.empty();
      brandDropdown.append('<option selected="true" disabled>Choose  
Make</option>');
      if (yearDropdown.value == '1976') {
        var optionArray = ["Yamaha", "Kawasaki"];
        //populate makes depending on year
        for (i = 0; i <= optionArray.length; i++) {
          var newOption = document.createElement('option');
          newOption.innerHTML = optionArray[i];
          brandDropdown.append(newOption);
        }
      }
    }

fitmentData.json

 [
 {
    "brand": "Yamaha",
    "model": "XT500",
    "year": "1976"
  },
  {
    "brand": "Honda",
    "model": "TL250",
    "year": "1976"
  },
  {
    "brand": "Yamaha",
    "model": "TT500",
    "year": "1976"
  },
  {
    "brand": "Honda",
    "model": "XL125",
    "year": "1976"
  },
  {
    "brand": "Kawasaki",
    "model": "KE125",
    "year": "1976"
  },
  {
    "brand": "Yamaha",
    "model": "YZ175",
    "year": "1976"
  },
  {
    "brand": "Honda",
    "model": "TL125",
    "year": "1976"
  },
  {
    "brand": "Suzuki",
    "model": "RM125",
    "year": "1976"
  }
]

我再次能够填充下拉列表中的所有 json 数据,但 updateMake() 函数未按预期工作。 updateMake() 导致 make 根本不填充任何数据。

最佳答案

您可以在 year 元素上添加 onchange 事件,以便在发生更改时调用 updateMake() 。另外,由于yearDropdown是一个jQuery对象,所以yearDropdown.value也不起作用,请考虑使用yearDropdown.val()代替:

var data = [{
    "brand": "Yamaha",
    "model": "XT500",
    "year": "1976"
  },
  {
    "brand": "Honda",
    "model": "TL250",
    "year": "1976"
  },
  {
    "brand": "Yamaha",
    "model": "TT500",
    "year": "1976"
  },
  {
    "brand": "Honda",
    "model": "XL125",
    "year": "1976"
  },
  {
    "brand": "Kawasaki",
    "model": "KE125",
    "year": "1976"
  },
  {
    "brand": "Yamaha",
    "model": "YZ175",
    "year": "1976"
  },
  {
    "brand": "Honda",
    "model": "TL125",
    "year": "1976"
  },
  {
    "brand": "Suzuki",
    "model": "RM125",
    "year": "1976"
  }
];



//year
let yearDropdown = $('#year').append('<option selected="true" disabled>Choose Year</option>').on('change', function() {
  updateMake();
});

//make(brand in json)
let brandDropdown = $('#make').append('<option selected="true" disabled>Choose Make</option>');

//append json years in dropdown
$.each(data, function(key, entry) {
  yearDropdown.append($('<option></option>').attr('value', entry.year).text(entry.year));
})
//remove year duplicates
var map = {}
$('select option').each(function() {
  if (map[this.value]) {
    $(this).remove()
  }
  map[this.value] = true;
})
//append json makes in dropdown
$.each(data, function(key, entry) {
  brandDropdown.append($('<option></option>').attr('value', entry.brand).text(entry.brand));
  updateMake();
});
//remove make duplicates
var map = {}
$('select option').each(function() {
  if (map[this.value]) {
    $(this).remove()
  }
  map[this.value] = true;
})

//updates makes depending on selection
function updateMake() {
  brandDropdown.empty();
  brandDropdown.append('<option selected="true" disabled>Choose Make</option>');
  if (yearDropdown.val() == '1976') {
    var optionArray = ["Yamaha", "Kawasaki"];
    //populate makes depending on year
    for (i = 0; i < optionArray.length; i++) {
      var newOption = document.createElement('option');
      newOption.innerHTML = optionArray[i];
      brandDropdown.append(newOption);
    }
  }
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<select name="year" id="year">

</select>

<select id="make" name="make">

</select>
<select id="model" name="model">

</select>

关于javascript - 根据选择填充下拉列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57140106/

相关文章:

c# - 将用户输入放入生成的 JavaScript 中的最佳方法?

javascript - 使用 Javascript 更改 head 标签内 CSS 的顺序

Html:在新窗口中打开页面。目标 ="_blanck"- 这是一个拼写错误吗?

php - 我什么时候想使用 .html 而不是 .php 作为文件扩展名?

javascript - 尝试添加 slideToggle() 函数但它不起作用

javascript - 带有自定义助手的handlebars.js 模板可对数据数组进行切片

javascript - 当内联 block div 高度增长时防止内容流动

c# - 如何避免在选择 DropDownList 时刷新页面

javascript - 访问 anchor 链接的父跨度对象

javascript - 如何根据 session 变量php过滤结果