js.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. //1. fetch basic
  2. // Исследуйте сайт swapi.dev, рассмотрите JSON-ы, которые предоставляются этим сервисом
  3. // (например: https://swapi.dev/api/people/1/, https://swapi.dev/api/people/2/, https://swapi.dev/api/starships/12/
  4. // С помощью следующего кода считать и вывести информацию о Люке Скайвокере:
  5. // Напишите функцию для отображения любого JSON в форме таблицы. Функция должна принимать два параметра:
  6. // DOM - элемент, в котором строится таблица
  7. // JSON, который нужно отобразить.
  8. // {
  9. // const person1 = 'https://swapi.dev/api/people/1/';
  10. // const person2 = 'https://swapi.dev/api/people/2/';
  11. // const person3 = 'https://swapi.dev/api/starships/12/';
  12. //
  13. // let table = document.createElement('table')
  14. // table.border = 1
  15. // document.body.append(table)
  16. //
  17. // function fetchBbasic (dom, source) {
  18. //
  19. // fetch(source).then(res => res.json())
  20. // .then(luke => {
  21. // for (let [key, value] of Object.entries(luke)) {
  22. // let tr = document.createElement("tr")
  23. // table.append(tr)
  24. //
  25. // let row = document.createElement('td')
  26. // row.innerText = key
  27. // tr.append(row)
  28. //
  29. // let rowValue = document.createElement('td')
  30. // rowValue.innerText = value
  31. // tr.append(rowValue)
  32. //
  33. // }
  34. // console.log(luke)
  35. // })
  36. // }
  37. // fetchBbasic(table, person1)
  38. // }
  39. // 2. Расширить функцию отображения:
  40. // Если одно из полей строка или массив.
  41. // Если строки или строка содержат в себе https://swapi.dev/api/
  42. // То выводить вместо текста строки кнопку, при нажатии на которую:
  43. // делается fetch данных по этой ссылке
  44. // функция отображения запускает сама себя(рекурсивно) для отображения новых данных в том же элементе.
  45. // {
  46. // fetch('https://swapi.dev/api/people/1/')
  47. // .then(res => res.json())
  48. // .then(luke => {
  49. // personTable(document.body, luke);
  50. // })
  51. //
  52. // function personTable(domElement, jsonElement, elemForRemoval) {
  53. // let table = document.createElement('table');
  54. // table.border = 1
  55. // //elemForRemoval?.remove();
  56. // domElement.append(table);
  57. //
  58. // for (let [key, value] of Object.entries(jsonElement)) {
  59. // let tr = document.createElement("tr")
  60. // table.append(tr)
  61. // let row = document.createElement('td')
  62. // row.innerText = key
  63. // tr.append(row)
  64. //
  65. // let rowValue = document.createElement('td')
  66. // rowValue.innerText = value
  67. // tr.append(rowValue)
  68. //
  69. // if (typeof key === 'string' && value.includes('https://swapi.dev/api/')) {
  70. // linkButton(value, rowValue)
  71. // }
  72. // else if (Array.isArray(value)) {
  73. // value.forEach(element => {
  74. // linkButton(element,rowValue)
  75. // })
  76. // }
  77. // }
  78. // }
  79. //
  80. // function linkButton(value, rowValue) {
  81. // let button = document.createElement('button');
  82. // button.innerText = 'OPEN LINK';
  83. // button.onclick = () => {
  84. // fetch(value)
  85. // .then(res => res.json())
  86. // .then(data => {
  87. // personTable(rowValue, data, button);
  88. // })
  89. // };
  90. // rowValue.append(button);
  91. // }
  92. // }
  93. //3. race
  94. // Используя Promise.race запустите запрос на API (swapi.dev) параллельно с delay. По результату определите, что было
  95. // быстрее, запрос по сети, или определенный интервал времени. Подберите параметр delay так, что бы результат был
  96. // неизвестен изначально, и при многократных запусках быстрее был то delay, то myfetch.
  97. // {
  98. // let myFetch = new Promise(resolve => fetch('https://swapi.dev/api/people/1/').then(res => res.json())
  99. // .then(luke => {
  100. // console.log(luke)
  101. // }) )
  102. //
  103. // function delay(ms){
  104. // function executor(fulfill, reject) {
  105. // setTimeout(() => fulfill(ms), ms) }
  106. // return new Promise(executor)
  107. // }
  108. // Promise.race([myFetch, delay(80)]).then((value) => {
  109. // console.log(value);
  110. // });
  111. //
  112. // }
  113. //4. Promisify: confirm
  114. // Промисифицируйте confirm. Напишите функцию, которая возвращает промис, который переходит в состояние fulfilled при
  115. // нажатии "OK" и реджектится при нажатии "Cancel". Функция должна принимать строку для confirm:
  116. // {
  117. // function confirmPromise(text){
  118. // function executor(fulfill, reject){
  119. // if (confirm(text) === true) {
  120. // fulfill()
  121. // } else {
  122. // reject()
  123. // }
  124. // }
  125. // return new Promise(executor)
  126. // }
  127. //
  128. // confirmPromise('Промисы это сложно?').then(() => console.log('не так уже и сложно'),
  129. // () => console.log('respect за усидчивость и внимательность'))
  130. // }
  131. //5. Promisify: prompt
  132. // Аналогично предыдующему заданию промисифицируйте prompt. В случае нажатия "ОК" промис резолвится и его результатом
  133. // становится текст, введенный пользователем в окне prompt. В случае нажатия "Отмены" - промис реджектится. Параметром
  134. // функции будет текст сообщения в prompt
  135. // {
  136. // function promptPromise(text) {
  137. // function executor(fulfill, reject) {
  138. // let answer = prompt(text);
  139. // if (answer) {
  140. // fulfill(answer);
  141. // } else {
  142. // reject();
  143. // }
  144. // }
  145. // return new Promise(executor);
  146. // }
  147. //
  148. // promptPromise("Как тебя зовут?").then(name => console.log(`Тебя зовут ${name}`),
  149. // () => console.log('Ну зачем морозиться, нормально же общались'))
  150. // }
  151. //6. Promisify: LoginForm
  152. // Промисифицируйте конструктор LoginForm. В промисифицированную функцию передается DOM-элемент - родитель для формы,
  153. // В колбэке, предназначенном для получения логина и пароля в момент нажатия кнопки "Login...", который вы назначаете в
  154. // объекте LoginForm, зарезолвите промис. Результатом промиса должен быть объект с ключами login и password, ключи
  155. // должны содержать значения полей ввода.
  156. // {
  157. // function loginPromise (parent) {
  158. // function executor (resolve, reject) {
  159. // const form = new LoginForm(parent, false)
  160. // form.inputButtonOnclick = function () {
  161. // resolve ({login: this.getLogin(), password: this.getPass()})
  162. // }
  163. // }
  164. // return new Promise(executor)
  165. // }
  166. //
  167. // loginPromise(document.body).then(({login, password}) => console.log(`Вы ввели ${login} и ${password}`))
  168. //
  169. //
  170. // function LoginForm(parent, passOpenDefault){
  171. // function Password(parent, open) {
  172. //
  173. // const inputPass = document.createElement('input')
  174. // parent.append(inputPass)
  175. // const checkboxPass = document.createElement('input')
  176. // checkboxPass.type = 'checkbox'
  177. // parent.append(checkboxPass)
  178. //
  179. // this.setValue = (value) => {
  180. // inputPass.value = value
  181. // if (typeof this.onChange === 'function') this.onChange(this.getValue()) // запускается по событию oninput в поле ввода, передает текст в колбэк
  182. // } //задает значение
  183. // this.getValue = () => inputPass.value //читает значение
  184. // this.setOpen = (open) => {
  185. // if (open) {
  186. // checkboxPass.checked = true
  187. // inputPass.type = "text"
  188. // }
  189. // if (!open) {
  190. // checkboxPass.checked = false
  191. // inputPass.type = "password"
  192. // }
  193. // if (typeof this.onOpenChange === 'function') this.onOpenChange(this.getOpen()) // запускается по изменению состояния открытости пароля
  194. // } //задает открытость текста в поле ввода
  195. // this.getOpen = () => checkboxPass.checked //читает открытость текста в поле ввода
  196. //
  197. // this.setOpen(open)
  198. // inputPass.oninput = () => this.setValue(this.getValue())
  199. // checkboxPass.oninput = () => this.setOpen(this.getOpen())
  200. //
  201. // }
  202. //
  203. // const LoginForm = document.createElement('div')
  204. // parent.append(LoginForm)
  205. //
  206. // const inputLogin = document.createElement('input')
  207. // LoginForm.append(inputLogin)
  208. //
  209. // let p = new Password(LoginForm, passOpenDefault)
  210. //
  211. // const inputButton = document.createElement('input')
  212. // inputButton.type = 'button'
  213. // inputButton.value = 'войти'
  214. // LoginForm.append(inputButton)
  215. // inputButton.disabled = true
  216. //
  217. // p.onChange = () => checkButtonDisabled()
  218. // inputLogin.oninput = () => checkButtonDisabled()
  219. //
  220. // function checkButtonDisabled () {
  221. // if (p.getValue() && inputLogin.value) inputButton.disabled = false
  222. // else inputButton.disabled = true
  223. // }
  224. //
  225. // this.getLogin = () => inputLogin.value
  226. // this.setLogin = (value) => {
  227. // inputLogin.value = value
  228. // checkButtonDisabled()
  229. //
  230. // }
  231. // this.getPass = () => p.getValue()
  232. // this.setPass = (value) => {
  233. // p.setValue(value)
  234. // checkButtonDisabled()
  235. // }
  236. //
  237. // inputButton.onclick = () => {
  238. // if (typeof this.inputButtonOnclick === 'function') this.inputButtonOnclick() //функция при нажатии на кнопку войти
  239. // }
  240. // }
  241. // }