javascript - 如何根据另一个下拉值选择多选动态填充的下拉列表

标签 javascript html jquery-ui multi-select dropdown

如何根据另一个下拉值选择来多选一个动态填充的下拉列表?

我在页面上有 2 个下拉菜单。第二个下拉列表在第一个实例中将为空。当您在第一个下拉列表中选择值时,基于该值,第二个下拉列表将可用。现在我想要第二个下拉菜单作为多选。

var mealsByCategory = {
    A: ["Soup", "Juice", "Tea", "Others"],
    B: ["Soup", "Juice", "Water", "Others"],
    C: ["Soup", "Juice", "Coffee", "Tea", "Others"]
}

    function changecat(value) {
        if (value.length == 0) document.getElementById("category").innerHTML = "<option></option>";
        else {
            var catOptions = "";
            for (categoryId in mealsByCategory[value]) {
                catOptions += "<option>" + mealsByCategory[value][categoryId] + "</option>";
            }
            document.getElementById("category").innerHTML = catOptions;
        }
    }
<select name="meal" id="meal" onChange="changecat(this.value);">
    <option value="" disabled selected>Select</option>
    <option value="A">A</option>
    <option value="B">B</option>
    <option value="C">C</option>
</select>
<select name="category" id="category">
    <option value="" disabled selected>Select</option>
</select>

有人知道我怎样才能得到这个吗?

最佳答案

如果您想直接使用 JavaScript 方式,唯一需要做的就是更改第二个 select到多选(例如 <select multiple> ),然后捕获选定的值...

但是,为了使其更易于维护,以及包括复选框方法,您可以创建自己的方式来动态设置它们(有很多方法可以实现)。让我们来看看:

var mealsByCategory = {
  A: ["Soup", "Juice", "Tea", "Others"],
  B: ["Soup", "Juice", "Water", "Others"],
  C: ["Soup", "Juice", "Coffee", "Tea", "Others"]
};

function changecat(value) {
  if (value.length == 0) document.getElementById("category").innerHTML = "<option></option>";
  else {
    var catOptions = "";
    for (categoryId in mealsByCategory[value]) {
    	var category = mealsByCategory[value][categoryId];
      catOptions += "<label><input type='checkbox' name='categories' value='" + category + "' onclick='checkOptions()'>" 
      	+  category + "</input></label>";
    }
    document.getElementById("checkboxes").innerHTML = catOptions;
  }
}

var expanded = false;

function showCheckboxes() {
  var checkboxes = document.getElementById("checkboxes");
  if (!expanded) {
    checkboxes.style.display = "block";
    expanded = true;
  } else {
    checkboxes.style.display = "none";
    expanded = false;
  }
}

function checkOptions() {
  els = document.getElementsByName('categories');
  var selectedChecks = "", qtChecks = 0;
  for (i = 0; i < els.length; i++) {
  	if (els[i].checked) {
      if (qtChecks > 0) selectedChecks += ", "
	  selectedChecks += els[i].value;
      qtChecks++;
    }
  }
  
  if(selectedChecks != "") {
    document.getElementById("defaultCategory").innerText = selectedChecks;
  } else {
    document.getElementById("defaultCategory").innerText = "Select an option";
  }
}
div.multiselect, select#meal, button {
  margin: 5px;
}

.multiselect {
  width: 200px;
}

.selectBox {
  position: relative;
}

.selectBox select {
  width: 100%;
  font-weight: bold;
}

.overSelect {
  position: absolute;
  left: 0;
  right: 0;
  top: 0;
  bottom: 0;
}

#checkboxes {
  display: none;
  border: 1px #dadada solid;
}

#checkboxes label {
  display: block;
}

#checkboxes label:hover {
  background-color: #1e90ff;
}
<select name="meal" id="meal" onchange="changecat(this.value);">
  <option value="" disabled selected>Select</option>
  <option value="A">A</option>
  <option value="B">B</option>
  <option value="C">C</option>
</select>

<div class="multiselect">
  <div class="selectBox" onclick="showCheckboxes()">
    <select name="category" id="category">
      <option id="defaultCategory">Select an option</option>
    </select>
    <div class="overSelect"></div>
  </div>
  <div id="checkboxes"></div>
</div>

看到我刚刚将您的帖子改编为@vitfo 解决方案(参见原始帖子 here ),所以如果适合您,也不要忘记感谢他。

此外,我们还有许多其他选项可以使用插件而不是方便的方式来处理带有复选框的多选。一个很好的例子是 Multiple Select library这很容易做出同样的事情。

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

相关文章:

javascript - 检查变量是否为函数类型

javascript - 您可以使用 event.target 定位元素父元素吗?

javascript - jQuery 旋转横幅问题

javascript - 在 javascript 或 jquery 中滚动到具有特定 id 的 html 元素

javascript - 并排动态创建div

javascript - 在 jQuery 插件的属性中未定义对对象方法的引用

html - 如何让 HTML 表单与前一个表单的右侧对齐?

jquery - 使用 jQuery 查找 DOM 中的元素

html - 部署后,Grails 标签、重定向不起作用

javascript - 切换内联模式 - jQuery UI datepicker