var request = new XMLHttpRequest() request.open('GET', 'https://raw.githubusercontent.com/David-Haim/CountriesToCitiesJSON/master/countriesToCities.json', true) // последний параметр указывает на синхронность или асинхронность запроса. В данном случае запрос асинхронный request.onreadystatechange = function(){ //обработчик изменения статуса запроса. Статус == 4 сигнализирует о том, что запрос окончен. if (request.readyState != 4){ return; } if (request.status == 200){ alert('all ok') console.log(JSON.parse(request.responseText)) var object = JSON.parse(request.responseText); var keys = Object.keys(object); var select = document.createElement("select"); for (var i = 0; i < keys.length; i++) { var option = document.createElement("option"); option.innerHTML = keys[i]; option.value = keys[i]; select.appendChild(option); } select.onchange = function(e){ console.log(this.value) var select = document.createElement("select"); for (var i = 0; i < object[this.value].length; i++) { var option = document.createElement("option") option.innerHTML = object[this.value][i]; select.appendChild(option); } if(document.body.children.length === 3){ document.body.replaceChild(select, document.getElementById("main").nextElementSibling); } else document.body.appendChild(select); } document.body.appendChild(select); select.id = "main" } else { alert('shit happens: ' + xhr.status + ', ' + xhr.statusText ); } } request.send()