【问题标题】:How to multiselect a dynamically populated dropdown based on another dropdown value selection如何根据另一个下拉值选择多选动态填充的下拉列表
【发布时间】:2017-03-19 17:46:01
【问题描述】:

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

我在页面上有 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 html jquery-ui multi-select dropdown


    【解决方案1】:

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

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

    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),所以如果它适合您,请不要忘记也感谢他。

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

    【讨论】:

    • 感谢您的宝贵回答...它工作正常..但我想直接显示在顶部而不是检查选项按钮..应该显示多少被选择或选择的名称..谢谢这么多
    • “直接显示在顶部”是什么意思?放入页面顶部的div 或作为选择的文本(我的意思是,而不是“选择一个选项”)?
    • 我的意思是代替“选择一个选项”
    • 很简单:只需添加一个onClick 以在每次选中(或未选中)选项时调用一个函数,然后循环复选框以查找选中的选项,连接它们的文本并显示它在选择的主标签上。如果您想显示所选项目的数量,同样的事情也是可能的。代码现已针对它进行了调整。
    【解决方案2】:

    您可以使用提供此功能的 jquery 插件,而不是自己开发:https://github.com/dnasir/jquery-cascading-dropdown

    【讨论】:

    • 感谢您的回复...但我希望第二个下拉菜单应该是多选...如何在填充数据后使用复选框来多选下拉值
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-11
    • 2017-09-28
    相关资源
    最近更新 更多