16_XMLHttpRequest.html 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>16_XMLHttpRequest</title>
  7. </head>
  8. <body>
  9. <select name="country" id="country" style="min-width: 100px"></select>
  10. <select name="city" id="city" style="min-width: 100px"></select>
  11. <button id="queryBtn">Запросить данные</button>
  12. <script>
  13. queryBtn.onclick = () => {
  14. let xhr = new XMLHttpRequest();
  15. xhr.open(
  16. "GEt",
  17. "https://raw.githubusercontent.com/David-Haim/CountriesToCitiesJSON/master/countriesToCities.json",
  18. true
  19. );
  20. queryBtn.disabled = true;
  21. xhr.onreadystatechange = function () {
  22. if (xhr.readyState == XMLHttpRequest.UNSENT) {
  23. queryBtn.innerText = "Начальное состояние";
  24. console.log("Начальное состояние");
  25. return;
  26. }
  27. if (xhr.readyState == XMLHttpRequest.OPENED) {
  28. queryBtn.innerText = "Вызван open";
  29. console.log("Вызван open");
  30. return;
  31. }
  32. if (xhr.readyState == XMLHttpRequest.HEADERS_RECEIVED) {
  33. queryBtn.innerText = "Получены заголовки";
  34. console.log("Получены заголовки");
  35. return;
  36. }
  37. if (xhr.readyState == XMLHttpRequest.LOADING) {
  38. queryBtn.innerText = "Загрузка...";
  39. console.log("Загрузка...");
  40. return;
  41. }
  42. // if (xhr.readyState != XMLHttpRequest.DONE) return;
  43. // console.log(xhr.responseText);
  44. if (xhr.status == 200) {
  45. let data = JSON.parse(xhr.responseText);
  46. // let data = xhr.response;
  47. console.log(data);
  48. queryBtn.innerText = "Готово";
  49. setTimeout(() => {
  50. queryBtn.innerText = "Еще раз запросить";
  51. queryBtn.disabled = false;
  52. }, 10000);
  53. haveData(data);
  54. //
  55. } else {
  56. let error = new Error(xhr.statusText);
  57. console.log(error);
  58. queryBtn.innerText = `Ошибка: ${xhr.status}`;
  59. setTimeout(() => {
  60. queryBtn.innerText = "Еще раз запросить";
  61. queryBtn.disabled = false;
  62. }, 5000);
  63. }
  64. };
  65. // xhr.responseType = "json";
  66. xhr.send();
  67. }; // queryBtn.onclick - end
  68. //
  69. const haveData = function (data = {}) {
  70. const newOption = function (item) {
  71. let option = document.createElement("option");
  72. option.setAttribute("value", item);
  73. option.append(item);
  74. return option;
  75. };
  76. const sortInput = function (sel) {
  77. var arr = Array.from(sel.children).sort((x, y) => {
  78. return x.text.localeCompare(y.text);
  79. });
  80. arr.forEach((x) => sel.appendChild(x));
  81. sel.selectedIndex = 0;
  82. };
  83. for (item in data) if (item) country.append(newOption(item));
  84. sortInput(country);
  85. country.onchange = function () {
  86. city.innerHTML = "";
  87. for (item of data[country.value]) if (item) city.append(newOption(item));
  88. sortInput(city);
  89. };
  90. country.onchange();
  91. };
  92. //
  93. </script>
  94. </body>
  95. </html>