Как заполнить каскадный раскрывающийся список с помощью JQuery

у меня следующая проблема:

Я начал создавать форму с HTML и JS, и есть два раскрывающихся списка (страна и город). теперь я хочу сделать эти два динамическими с помощью JQuery, чтобы были видны только города выбранных стран.

Я начал с некоторого базового 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/

Я знаю, что это очень просто, но я не вижу леса за деревьями.


person user2609756    schedule 21.08.2013    source источник
comment
ваша скрипка не работала jsfiddle.net/arunpjohny/2pza5/1   -  person Arun P Johny    schedule 21.08.2013


Ответы (5)


Это должно быть так же просто, как

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

person Arun P Johny    schedule 21.08.2013
comment
Обратите внимание, что map не работает в IE версии ‹ 9 (ссылка). Вам нужно будет добавить polyfill< /а>. - person Vinit Divekar; 12.07.2018

Я собираюсь предоставить второе решение, так как этот пост все еще находится в поиске 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>
person marco bonfigli    schedule 06.03.2015
comment
Спасибо, это сработало хорошо. USP: Подготовка данных не требует много времени. Линейный список, html может быть сгенерирован простой формулой Excel (или простым циклом, если кто-то загружает csv и динамически заполняет данные). Таким образом, обновление/поддержание данных просто. - person Nikhil VJ; 30.09.2019

Я создал каскадное выпадающее меню для страны, штата, города и почтового индекса.

Это может быть полезно для кого-то. Здесь размещена только некоторая часть кода, вы можете увидеть полный рабочий пример на 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);
     }
}

Демонстрация скрипта

person Rikin Patel    schedule 12.04.2016

Это пример, который я сделал. Я желаю, чтобы это было полезно для вас.

$(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>

person Abdelwahid Oubaalla    schedule 22.09.2018

person    schedule
comment
тот же пример от Аруна П. Джони. - person Java Script; 25.09.2017