【问题标题】:How to populate a cascading Dropdown with JQuery如何使用 JQuery 填充级联下拉菜单
【发布时间】:2013-08-23 12:00:05
【问题描述】:

我有以下问题:

我开始用 HTML 和 JS 创建一个表单,并且有两个下拉菜单(国家和城市)。现在我想用 JQuery 使这两个动态化,以便只有所选国家的城市可见。

我从一些基本的 JS 开始,这些 JS 运行良好,但在 IE 中出现了一些问题。现在我正在尝试将我的 JS 转换为 JQuery 以获得更好的兼容性。

我原来的 JS 是这样的:

function populate(s1, s2) {
    var s1 = document.getElementById(s1);
    var s2 = document.getElementById(s2);
    s2.innerHTML = "";
    if (s1.value == "Germany") {
        var optionArray = ["|", "magdeburg|Magdeburg", "duesseldorf|Duesseldorf", "leinfelden-echterdingen|Leinfelden-Echterdingen", "eschborn|Eschborn"];
    } else if (s1.value == "Hungary") {
        var optionArray = ["|", "pecs|Pecs", "budapest|Budapest", "debrecen|Debrecen"];
    } else if (s1.value == "Russia") {
        var optionArray = ["|", "st. petersburg|St. Petersburg"];
    } else if (s1.value == "South Africa") {
        var optionArray = ["|", "midrand|Midrand"];
    } else if (s1.value == "USA") {
        var optionArray = ["|", "downers grove|Downers Grove"];
    } else if (s1.value == "Mexico") {
        var optionArray = ["|", "puebla|Puebla"];
    } else if (s1.value == "China") {
        var optionArray = ["|", "beijing|Beijing"];
    } else if (s1.value == "Spain") {
        var optionArray = ["|", "barcelona|Barcelona"];
    }

    for (var option in optionArray) {
        var pair = optionArray[option].split("|");
        var newOption = document.createElement("option");
        newOption.value = pair[0];
        newOption.innerHTML = pair[1];
        s2.options.add(newOption);
    }
};

这里是我的 Jquery:

http://jsfiddle.net/HvXSz/

我知道这很简单,但我只见树木不见森林。

【问题讨论】:

标签: javascript jquery html-select cascadingdropdown


【解决方案1】:

应该这么简单

jQuery(function($) {
    var locations = {
        'Germany': ['Duesseldorf', 'Leinfelden-Echterdingen', 'Eschborn'],
        'Spain': ['Barcelona'],
        'Hungary': ['Pecs'],
        'USA': ['Downers Grove'],
        'Mexico': ['Puebla'],
        'South Africa': ['Midrand'],
        'China': ['Beijing'],
        'Russia': ['St. Petersburg'],
    }

    var $locations = $('#location');
    $('#country').change(function () {
        var country = $(this).val(), lcns = locations[country] || [];

        var html = $.map(lcns, function(lcn){
            return '<option value="' + lcn + '">' + lcn + '</option>'
        }).join('');
        $locations.html(html)
    });
});

演示:Fiddle

【讨论】:

  • 请注意 map 不适用于 IE 版本 link)。您需要添加polyfill
【解决方案2】:

我将提供第二个解决方案,因为这篇文章仍在 Google 搜索中搜索“jquery cascade select”。 这是第一个选择:

<select class="select" id="province" onchange="filterCity();">
  <option value="1">RM</option>
  <option value="2">FI</option>
</select>

这是第二个,在第一个被选中之前禁用:

<select class="select" id="city" disabled>
  <option data-province="RM" value="1">ROMA</option>
  <option data-province="RM" value="2">ANGUILLARA SABAZIA</option>
  <option data-province="FI" value="3">FIRENZE</option>
  <option data-province="FI" value="4">PONTASSIEVE</option>
</select>

这个是不可见的,它充当了所有被选择过滤掉的元素的容器:

<span id="option-container" style="visibility: hidden; position:absolute;"></span>

最后是过滤的脚本:

<script>

    function filterCity(){
      var province = $("#province").find('option:selected').text(); // stores province
      $("#option-container").children().appendTo("#city"); // moves <option> contained in #option-container back to their <select>
      var toMove = $("#city").children("[data-province!='"+province+"']"); // selects city elements to move out
      toMove.appendTo("#option-container"); // moves city elements in #option-container
      $("#city").removeAttr("disabled"); // enables select
};
</script>

【讨论】:

  • 谢谢,效果很好。 USP:它不需要太多的数据准备。线性列表,html 可以通过简单的 excel 公式生成(如果加载 csv 并动态填充数据,则可以使用简单的循环)。因此,更新/维护数据很简单。
【解决方案3】:

我已经为 Country、State、City 和 Zip 创建了级联下拉列表

它可能对某人有帮助。这里只发布了部分代码,您可以在 jsfiddle 上看到完整的工作示例。

//Get html elements
var countySel = document.getElementById("countySel");
var stateSel = document.getElementById("stateSel"); 
var citySel = document.getElementById("citySel");
var zipSel = document.getElementById("zipSel");

//Load countries
for (var country in countryStateInfo) {
    countySel.options[countySel.options.length] = new Option(country, country);
}

//County Changed
countySel.onchange = function () {

     stateSel.length = 1; // remove all options bar first
     citySel.length = 1; // remove all options bar first
     zipSel.length = 1; // remove all options bar first

     if (this.selectedIndex < 1)
         return; // done

     for (var state in countryStateInfo[this.value]) {
         stateSel.options[stateSel.options.length] = new Option(state, state);
     }
}

Fiddle Demo

【讨论】:

    【解决方案4】:
    I have a handy code. you can just copy it: 
    Same as above
    
    
    <html>
        <head>
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
        <script>
    jQuery(function($) {
        var locations = {
            'Germany': ['Duesseldorf', 'Leinfelden-Echterdingen', 'Eschborn', 'asdasdasd'],
            'Spain': ['Barcelona'],
            'Hungary': ['Pecs'],
            'USA': ['Downers Grove'],
            'Mexico': ['Puebla'],
            'South Africa': ['Midrand'],
            'China': ['Beijing'],
            'Japn': ['tokyo'],
            'Shuidong': ['shuidongjie','maomingjie'],
            'Russia': ['St. Petersburg'],
        }
    
        var $locations = $('#location');
        $('#country').change(function () {
            var country = $(this).val(), lcns = locations[country] || [];
    
            var html = $.map(lcns, function(lcn){
                return '<option value="' + lcn + '">' + lcn + '</option>'
            }).join('');
            $locations.html(html)
        });
    });
    </script>
    </head>
    <body>1
    <label class="page1">Country</label>
    <div class="tooltips" title="Please select the country that the customer will primarily be served from">
        <select id="country" name="country" placeholder="Phantasyland">
            <option></option>
            <option>Germany</option>
            <option>Spain</option>
            <option>Hungary</option>
            <option>USA</option>
            <option>Mexico</option>
            <option>South Africa</option>
            <option>China</option>
            <option>Japn</option>
            <option>Shuidong</option>
            <option>Russia</option>
    
        </select>
    </div>
    <br />
    <br />
    <label class="page1">Location</label>
    <div class="tooltips" title="Please select the city that the customer is primarily to be served from.">
        <select id="location" name="location" placeholder="Anycity"></select>
    </div>
    </body>
    </html>
    

    【讨论】:

    • 来自 Arun P Johny 的相同示例。
    【解决方案5】:

    这是我做过的一个例子。我希望这对你有用。

    $(document).ready(function(){
    
        var ListNiveauCycle = [{"idNiveau":1,"libelleNiveau":"CL1","idCycle":1},{"idNiveau":26,"libelleNiveau":"Niveau 22","idCycle":24},{"idNiveau":34,"libelleNiveau":"CL3","idCycle":1},{"idNiveau":35,"libelleNiveau":"DAlf3","idCycle":1}];
        console.log(ListNiveauCycle);
    	
    	
    	function remplirListNiveau(idCycle){
    			console.log('remplirListNiveau');
    			var $niveauSelect = $("#niveau");
    			// vider la liste
    			$niveauSelect.empty();
    			 for (var i = 0; i < ListNiveauCycle.length; i++) {
    				 			if(ListNiveauCycle[i].idCycle==idCycle){
    		                        var opt1 = document.createElement('option');
    		                        opt1.innerHTML = ListNiveauCycle[i].libelleNiveau;
    		                        opt1.value = ListNiveauCycle[i].idNiveau;
    		                        $niveauSelect.append(opt1);
    		                        }
    		                    }
    	}
    	
    	$("#cycles").change(function(){
    		remplirListNiveau(this.value)
    	});
    	
    });
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <div class="form-group row">
                              <label class="col-sm-3 col-form-label">Cycle</label>
                              <div class="col-sm-9">
                                <select class="form-control" id="cycles" required="">
                                  <option value="">-----------</option>
        						  <option value="1">Cycle1</option>
        						  <option value="24">Cycle2</option>
                                </select>
                              </div>
                            </div>
             
             <div class="col-md-4">
                            <div class="form-group row">
                              <label class="col-sm-3 col-form-label">Niveau</label>
                              <div class="col-sm-9">
                                <select id="niveau" class="form-control" required="" name="niveau.id">
                                </select>
                              </div>
                            </div>
                          </div>

    【讨论】:

      猜你喜欢
      • 2016-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-26
      相关资源
      最近更新 更多