countries.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. // JSON.
  2. // -------------УСЛОВИЕ-------------
  3. // Загрузить используя XMLHttpRequest и распарсить как ассоциативный массив.
  4. // Организовать выбор страны и города, используя два select и ассоциативный массив из примера выше.
  5. // При выборе страны в списке городов должны быть только города из выбранной страны.
  6. // -------------РЕШЕНИЕ-------------
  7. //Начальная разметка
  8. const task01block = document.createElement('div');
  9. task01block.style = "border: 2px solid green; border-radius:5px; margin-bottom:10px; padding:10px";
  10. const task01title = document.createElement('h2');
  11. task01title.innerText = 'Task-01 Countries choice';
  12. const countrySelect = document.createElement('select');
  13. const citySelect = document.createElement('select');
  14. countrySelect.innerHTML = "<option value='hide'> -- Country loading--</option>";
  15. countrySelect.style = "margin-left:10px; margin-right:10px";
  16. citySelect.style = "margin-left:10px";
  17. citySelect.innerHTML = "<option value='hide'> -- City loading--</option>";
  18. root.appendChild(task01block);
  19. task01block.appendChild(task01title);
  20. task01block.appendChild(countrySelect);
  21. task01block.appendChild(citySelect);
  22. //Подставляет страну из запроса
  23. function chooseCountry(responseObj) {
  24. const countryList = Object.keys(responseObj);
  25. const countryStr = countryList.sort().map(item =>(!(item===''))&&("<option value=" + item + ">" + item + "</option>"));
  26. countrySelect.innerHTML = "<option value='hide'> -- Select country --</option>" + countryStr;
  27. countrySelect.onchange = () => { chooseCity(countrySelect.value, responseObj) }
  28. }
  29. //Подставляет города в зависимости от выбранной страны
  30. function chooseCity(countrySelected, responseObj) {
  31. const cityStr = responseObj[countrySelected].sort().map(item => "<option value=" + item + ">" + item + "</option>");
  32. citySelect.innerHTML = "<option value='hide'> -- Select city --</option>" + cityStr;
  33. }
  34. var request = new XMLHttpRequest()
  35. const url = 'https://raw.githubusercontent.com/David-Haim/CountriesToCitiesJSON/master/countriesToCities.json';
  36. request.open('GET', url, true) // последний параметр указывает на синхронность или асинхронность запроса. В данном случае запрос асинхронный
  37. request.onreadystatechange = function(){ //обработчик изменения статуса запроса. Статус == 4 сигнализирует о том, что запрос окончен.
  38. if (request.readyState != 4){
  39. return;
  40. }
  41. if (request.status == 200){
  42. const responseObj = JSON.parse(request.responseText);
  43. chooseCountry(responseObj );
  44. }
  45. else {
  46. alert('shit happens: ' + request.status + ', ' + request.statusText );
  47. }
  48. }
  49. request.send() // инициируем запрос.