js.js 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435
  1. //1.Person Constructor +
  2. // Переделайте задание createPerson на функцию конструктор Person.
  3. // {
  4. // const a = new Person("Вася", "Пупкин")
  5. // const b = new Person("Анна", "Иванова")
  6. // const c = new Person("Елизавета", "Петрова")
  7. //
  8. // console.log(a.getFullName()) //Вася Пупкин
  9. // a.fatherName = 'Иванович' //Вася Иванович Пупкин
  10. // console.log(b.getFullName()) //Анна Иванова
  11. //
  12. // function Person(name, surname) {
  13. // this.name = name,
  14. // this.surname = surname,
  15. // this.getFullName = () => `${this.name} ${this.fatherName || ""} ${this.surname}`
  16. // }
  17. // }
  18. // 2. Person Prototype
  19. // Переделайте предыдущее задание, вынеся методы в прототип.
  20. // Для этого вместо присвоения в this занесите их в объект Person.prototype. После
  21. // этой переделки все должно работать по старому:
  22. // {
  23. // function Person (name, surname) {
  24. // this.name = name,
  25. // this.surname = surname
  26. // }
  27. //
  28. // Person.prototype.getFullName = function (name, surname) {
  29. // return `${this.name} ${this.fatherName || ""} ${this.surname}`
  30. // }
  31. //
  32. // const a = new Person("Вася", "Пупкин")
  33. // const b = new Person("Анна", "Иванова")
  34. // const c = new Person("Елизавета", "Петрова")
  35. //
  36. // console.log(a.getFullName()) //Вася Пупкин
  37. // a.fatherName = 'Иванович' //Вася Иванович Пупкин
  38. //
  39. // console.log(a.getFullName())
  40. // console.log(b.getFullName())
  41. // }
  42. // 3. Переделайте функцию createStore (та, которая хранилище Redux) на конструктор Store. Прототип не используйте;
  43. // оставьте переменные state, cbs и reducer замкнутыми. Соответственно методы subscribe, dispatch и getState должны
  44. // быть объявлены внутри функции-конструктора и не могут быть в прототипе. Проверьте переделанный конструктор на вашем
  45. // ДЗ по ларьку;
  46. //
  47. // function Store(reducer) {
  48. // let state = reducer(undefined, {})
  49. // let cbs = []
  50. //
  51. // this.getState = () => state
  52. // this.subscribe = cb => (cbs.push(cb), //запоминаем подписчиков в массиве
  53. // () => cbs = cbs.filter(c => c !== cb)) //возвращаем функцию unsubscribe, которая удаляет подписчика из списка
  54. //
  55. // this.dispatch = action => {
  56. // const newState = reducer(state, action) //пробуем запустить редьюсер
  57. // if (newState !== state) { //проверяем, смог ли редьюсер обработать action
  58. // state = newState //если смог, то обновляем state
  59. // for (let cb of cbs) cb() //и запускаем подписчиков
  60. // }
  61. // }
  62. // }
  63. //
  64. // function reducer(state, {type, productName, productAmount, sum}){
  65. // if (!state){ //начальная уборка в ларьке:
  66. // return {
  67. // пиво: {
  68. // amount: 100,
  69. // price: 35,
  70. // },
  71. // чипсы: {
  72. // amount: 100,
  73. // price: 28,
  74. // },
  75. // сиги: {
  76. // amount: 100,
  77. // price: 90,
  78. // },
  79. // }
  80. // }
  81. // if (type === 'Купить' && productAmount <= state[productName].amount && sum >= state[productName].price * productAmount){ //если тип action - КУПИТЬ, то:
  82. // return {
  83. // ...state, //берем все что было из ассортимента
  84. // [productName]: {
  85. // amount: state[productName].amount - productAmount,
  86. // price: state[productName].price
  87. // },
  88. // }
  89. // }
  90. // return state //если мы не поняли, что от нас просят в `action` - оставляем все как есть
  91. // }
  92. //
  93. // function actionCreator (type, productName, productAmount, sum){
  94. // return {
  95. // type,
  96. // productName,
  97. // productAmount,
  98. // sum
  99. // }
  100. // }
  101. //
  102. // let store = new Store(reducer);
  103. // console.log(store)
  104. // myState = store.getState()
  105. // console.log(myState)
  106. //
  107. // const showCase = document.createElement('section')
  108. // document.body.append(showCase)
  109. // showCase.classList.add('showCase')
  110. //
  111. // const productSelect = document.createElement('select')
  112. // document.body.append(productSelect)
  113. //
  114. // const productQuantityOrderTitle = document.createElement('div')
  115. // productQuantityOrderTitle.innerText = 'Количество:'
  116. // document.body.append(productQuantityOrderTitle)
  117. //
  118. // const productQuantityInput = document.createElement('input')
  119. // productQuantityInput.type = 'number'
  120. // productQuantityInput.min = '0'
  121. // document.body.append(productQuantityInput)
  122. //
  123. // const moneyTitle = document.createElement('div')
  124. // moneyTitle.innerText = 'Деньги:'
  125. // document.body.append(moneyTitle)
  126. //
  127. // const money = document.createElement('input')
  128. // money.type = 'number'
  129. // money.min = '0'
  130. // document.body.append(money)
  131. //
  132. // const buttonBuy = document.createElement('button')
  133. // buttonBuy.value = 'Купить'
  134. // buttonBuy.innerText = 'Купить'
  135. // document.body.append(buttonBuy)
  136. // buttonBuy.onclick = () => {
  137. // store.dispatch(actionCreator(buttonBuy.value, productSelect.value, +productQuantityInput.value, +money.value))
  138. // }
  139. //
  140. // for (const product in store.getState()){
  141. //
  142. // const productCard = document.createElement('div')
  143. // productCard.classList.add('productCard')
  144. //
  145. // const productName = document.createElement('h2')
  146. // productName.innerText = product
  147. // productName.classList.add('productName')
  148. //
  149. // const productPrice = document.createElement('div')
  150. // productPrice.innerText = store.getState()[product].price + ' грн'
  151. // productPrice.classList.add('productPrice')
  152. //
  153. // const productAmount = document.createElement('div')
  154. // productAmount.innerText = store.getState()[product].amount + ' шт'
  155. // productAmount.classList.add('productQuantity')
  156. //
  157. // productCard.append(productName, productAmount, productPrice)
  158. // showCase.append(productCard)
  159. //
  160. // const productOption = document.createElement('option')
  161. // productOption.innerText = product
  162. // productSelect.append(productOption)
  163. //
  164. // const productAmountChange= store.subscribe( () => {
  165. // productAmount.innerText = store.getState()[product].amount + ' шт'
  166. // })
  167. // }
  168. //4. Password
  169. //Напишите функцию конструктор Password, которая будет в родительском элементе создавать поле ввода для пароля и
  170. // кнопку/иконку/чекбокс, который будет переключать режим просмотра пароля в поле ввода. (видимый пароль или нет,
  171. // input type='text' или же input type='password')
  172. // Параметры:
  173. // parent - родительский элемент
  174. // open - стартовое состояние
  175. // Методы:
  176. // setValue/getValue - задают/читают значения
  177. // setOpen/getOpen - задают/читают открытость текста в поле ввода
  178. // Колбэки (функции обратного вызова, который возможно, будут заданы снаружи конструктора):
  179. // onChange - запускается по событию oninput в поле ввода, передает текст в колбэк
  180. // onOpenChange - запускается по изменению состояния открытости пароля
  181. // {
  182. // function Password(parent, open) {
  183. //
  184. // const passwordInput = document.createElement('input')
  185. // passwordInput.placeholder = 'Введите пароль '
  186. // parent.append(passwordInput)
  187. //
  188. // const checkboxInput = document.createElement('input')
  189. // checkboxInput.type = 'checkbox'
  190. // parent.append(checkboxInput)
  191. //
  192. // this.setValue = value => {
  193. // passwordInput.value = value
  194. // }
  195. //
  196. // this.getValue = () => passwordInput.value
  197. //
  198. // this.setOpen = open => {
  199. // if (open === true) {
  200. // checkboxInput.checked = true
  201. // passwordInput.type = "text"
  202. // }
  203. // if (open === false) {
  204. // checkboxInput.checked = false
  205. // passwordInput.type = "password"
  206. // }
  207. // }
  208. // this.getOpen = () => checkboxInput.checked
  209. //
  210. // passwordInput.oninput = () => this.setValue(this.getValue())
  211. // checkboxInput.oninput = () => this.setOpen(this.getOpen())
  212. // }
  213. //
  214. // let p = new Password(document.body, true)
  215. //
  216. // p.onChange = data => console.log(data)
  217. // p.onOpenChange = open => console.log(open)
  218. //
  219. // p.setValue('qwerty')
  220. // console.log(p.getValue())
  221. //
  222. // p.setOpen(false)
  223. // console.log(p.getOpen())
  224. // }
  225. //5. LoginForm
  226. // С помощью предыдущего кода Password сделайте форму логина, кнопка в которой будет
  227. // активна только если и login и пароль не пусты.
  228. //
  229. {
  230. function Password(parent, open) {
  231. let passwordInput = document.createElement('input')
  232. passwordInput.placeholder = 'Введите пароль '
  233. parent.append(passwordInput)
  234. let checkboxInput = document.createElement('input')
  235. checkboxInput.type = 'checkbox'
  236. parent.append(checkboxInput)
  237. this.setValue = value => {
  238. passwordInput.value = value
  239. if (typeof this.onChange === 'function') {
  240. this.onChange(this.getValue()) }
  241. }
  242. this.getValue = () => passwordInput.value
  243. this.setOpen = open => {
  244. if (open === true) {
  245. checkboxInput.checked = true
  246. passwordInput.type = "text"
  247. }
  248. if (open === false) {
  249. checkboxInput.checked = false
  250. passwordInput.type = "password"
  251. }
  252. if (typeof this.onOpenChange === 'function') {
  253. this.onOpenChange(this.getOpen())
  254. }
  255. }
  256. this.getOpen = () => checkboxInput.checked
  257. this.setOpen(open)
  258. passwordInput.oninput = () => this.setValue(this.getValue())
  259. checkboxInput.oninput = () => this.setOpen(this.getOpen())
  260. }
  261. const loginInput = document.createElement('input')
  262. loginInput.placeholder = 'Введите логин'
  263. document.body.append(loginInput)
  264. let p = new Password(document.body, false)
  265. const buttonLogin = document.createElement('input')
  266. buttonLogin.value = 'Login'
  267. buttonLogin.type = 'button'
  268. document.body.append(buttonLogin)
  269. buttonLogin.disabled = true
  270. p.onChange = () => buttonDisabled()
  271. function buttonDisabled () {
  272. if (!loginInput.value) {
  273. buttonLogin.disabled = true
  274. }
  275. else buttonLogin.disabled = false
  276. }
  277. }
  278. //6. LoginForm Constructor
  279. // оформите предыдущую задачу как функцию-конструктор. Продумайте и предусмотрите геттеры, сеттеры и колбэки.
  280. // {
  281. // function Form () {
  282. // function Password(parent, open) {
  283. //
  284. // let passwordInput = document.createElement('input')
  285. // passwordInput.placeholder = 'Введите пароль '
  286. // parent.append(passwordInput)
  287. //
  288. // let checkboxInput = document.createElement('input')
  289. // checkboxInput.type = 'checkbox'
  290. // parent.append(checkboxInput)
  291. //
  292. // this.setValue = value => {
  293. // passwordInput.value = value
  294. // if (typeof this.onChange === 'function') {
  295. // this.onChange(this.getValue()) }
  296. // }
  297. //
  298. // this.getValue = () => passwordInput.value
  299. //
  300. // this.setOpen = open => {
  301. // if (open === true) {
  302. // checkboxInput.checked = true
  303. // passwordInput.type = "text"
  304. // }
  305. // if (open === false) {
  306. // checkboxInput.checked = false
  307. // passwordInput.type = "password"
  308. // }
  309. // // if (typeof this.onOpenChange === 'function') {
  310. // // this.onOpenChange(this.getOpen())
  311. // // }
  312. // }
  313. //
  314. // this.getOpen = () => checkboxInput.checked
  315. //
  316. // this.setOpen(open)
  317. // passwordInput.oninput = () => this.setValue(this.getValue())
  318. // checkboxInput.oninput = () => this.setOpen(this.getOpen())
  319. // }
  320. //
  321. // const loginInput = document.createElement('input')
  322. // loginInput.placeholder = 'Введите логин'
  323. // document.body.append(loginInput)
  324. //
  325. // let p = new Password(document.body, false)
  326. //
  327. // const buttonLogin = document.createElement('input')
  328. // buttonLogin.value = 'Login'
  329. // buttonLogin.type = 'button'
  330. // document.body.append(buttonLogin)
  331. // buttonLogin.disabled = true
  332. //
  333. // p.onChange = () => buttonDisabled()
  334. //
  335. // function buttonDisabled () {
  336. // if (!loginInput.value) {
  337. // buttonLogin.disabled = true
  338. // }
  339. // else buttonLogin.disabled = false
  340. // }
  341. // }
  342. //
  343. // Form()
  344. // }
  345. //7. Password Verify
  346. // С помощью Password сделайте пару инпутов, которые проверяют введеный пароль (в двух полях ввода) на совпадение. Подсвечивайте поля красным цветом/бордером когда пароли не совпадают При открытом пароле в первом поле ввода (которое реализуется с помощью объекта класса Password второе поле вводы должно пропадать с экрана Таким образом:
  347. //
  348. // Когда Password в скрытом режиме - появляется второй инпут (<input type='password'>) с паролем в скрытом режиме
  349. // Когда Password в открытом режиме - второй инпут пропадает
  350. // {
  351. // function Password(parent, open) {
  352. //
  353. // const passwordInput = document.createElement('input')
  354. // passwordInput.placeholder = 'Введите пароль '
  355. // parent.append(passwordInput)
  356. //
  357. // const checkboxInput = document.createElement('input')
  358. // checkboxInput.type = 'checkbox'
  359. // parent.append(checkboxInput)
  360. //
  361. // this.setValue = value => {
  362. // passwordInput.value = value
  363. // if (typeof this.onChange === 'function') this.onChange(this.getValue())
  364. // }
  365. //
  366. // this.getValue = () => passwordInput.value
  367. //
  368. // this.setOpen = open => {
  369. // if (open === true) {
  370. // checkboxInput.checked = true
  371. // passwordInput.type = "text"
  372. // }
  373. // if (open === false) {
  374. // checkboxInput.checked = false
  375. // passwordInput.type = "password"
  376. // }
  377. // }
  378. //
  379. // this.getOpen = () => checkboxInput.checked
  380. // this.getinputPass = () => passwordInput
  381. //
  382. // this.setOpen(open)
  383. // passwordInput.oninput = () => this.setValue(this.getValue())
  384. // checkboxInput.oninput = () => this.setOpen(this.getOpen())
  385. // }
  386. //
  387. // const pass1 = document.createElement('div')
  388. // document.body.append(pass1)
  389. // const pass2 = document.createElement('div')
  390. // document.body.append(pass2)
  391. //
  392. // const p1 = new Password (pass1, false)
  393. // const p2 = new Password (pass2, false)
  394. //
  395. // Password.prototype.onChange = function () { passInputEqalityCheck(p1, p2) }
  396. //
  397. // const passInputEqalityCheck = (pass1, pass2) => {
  398. //
  399. // if ( pass1.getValue() !== pass2.getValue() ) {
  400. // pass1.getinputPass().style.backgroundColor = 'red'
  401. // pass2.getinputPass().style.backgroundColor = 'red'
  402. // } else {
  403. // pass1.getinputPass().style.backgroundColor = 'green'
  404. // pass2.getinputPass().style.backgroundColor = 'green'
  405. // }
  406. // }
  407. // const pass2Open = (pass1GetOpen) => {
  408. // if (pass1GetOpen === true) pass2.style.display = 'none'
  409. // else pass2.style.display = 'block'
  410. // }
  411. //
  412. // p1.onOpenChange = function () {
  413. // pass2Open (this.getOpen() )
  414. // }
  415. // }