HW18_PedestrianTrafficLight.html 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <style>
  9. #traffic-light {
  10. border: 2px solid black;
  11. padding: 20px;
  12. border-radius: 50px;
  13. width: min-content;
  14. }
  15. #color-red,
  16. #color-green {
  17. width: 100px;
  18. height: 100px;
  19. border-radius: 50%;
  20. border: 10px solid black;
  21. margin-bottom: 10px;
  22. background-color: transparent;
  23. }
  24. #btn {
  25. padding: 5px 25px;
  26. font-size: 1.2em;
  27. min-width: 164px;
  28. margin-top: 20px;
  29. }
  30. </style>
  31. </head>
  32. <body>
  33. <div id="traffic-light">
  34. <div id="color-red">
  35. </div>
  36. <div id="color-green">
  37. </div>
  38. </div>
  39. <button id="btn" type="button">Зеленый</button>
  40. </body>
  41. <script>
  42. const delay = ms => new Promise(ok => setTimeout(() => ok(ms), ms));
  43. function domEventPromise(element, nameOfEvent) {
  44. function executor(resolve) {
  45. function event(param) {
  46. element.disabled = true;
  47. element.removeEventListener(nameOfEvent, event);
  48. setTimeout(() => resolve(param), 3000);
  49. }
  50. element.disabled = false;
  51. element.addEventListener(nameOfEvent, event)
  52. }
  53. return new Promise(executor);
  54. }
  55. async function pedestrianTrafficLight(ms) {
  56. while (true) {
  57. const red = document.getElementById('color-red')
  58. red.style.backgroundColor = 'red'
  59. await Promise.race([
  60. delay(ms),
  61. domEventPromise(document.getElementById('btn'), 'click')
  62. ])
  63. red.style.backgroundColor = 'transparent'
  64. const green = document.getElementById('color-green')
  65. green.style.backgroundColor = 'green'
  66. await delay(ms)
  67. green.style.backgroundColor = 'transparent'
  68. }
  69. }
  70. pedestrianTrafficLight(6000);
  71. </script>
  72. </html>