Отрисовка календаря на JavaScript
Задача: нарисовать нечто подобное

Решение:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 | var days_week = [                     'Жуть',             'Понедельник',           'Вторник',           'Среда',           'Четверг',           'Пятница',           'Суббота',           'Воскресенье',         ];               var month_names=[         "",           "Январь",         "Февраль",         "Март",         "Апрель",         "Май",         "Июнь",         "Июль",         "Август",         "Сентябрь",         "Октябрь",         "Ноябрь",         "Декабрь"       ];     function GetDayWork(year,month,day){         dayw=new Date(year, month-1, day).getDay();         if (dayw==0) return 7;         return dayw;     };     function ReturnToBookingPanel(){       $(".DateTimePickerForBooking").hide();         $(".booking-now").show();     };     function GetLastNextCal(month,year,next){         month=month+next;         if (month==0){month=12;year--;}         if (month==13){month=1;year++;}         PaintBookingMonth(month,year);     };     function PaintBookingMonth(month,year){               cal_html='';        cal_html=cal_html+'<div class="calendar_row calendar_row-head">';        cal_html=cal_html+' <div class="calendar_head-date">'+month_names[month]+' <span>'+year+'</span></div>';        cal_html=cal_html+'       <div class="calendar_row-head-arrows">';        cal_html=cal_html+'            <div class="arrow arrow-prev" onclick="GetLastNextCal('+month+','+year+',-1)">';        cal_html=cal_html+'                  <img src="/img/arr_cal_l.svg">';        cal_html=cal_html+'            </div>';        cal_html=cal_html+'            <div class="arrow arrow-next"  onclick="GetLastNextCal('+month+','+year+',1)">';        cal_html=cal_html+'                  <img src="/img/arr_cal_r.svg">';        cal_html=cal_html+'           </div>';        cal_html=cal_html+'       </div>';        cal_html=cal_html+'</div>';         cal_html=cal_html+'<div class="calendar_row calendar_row-weekdays">';        cal_html=cal_html+'   <div class="item">Пн</div>';        cal_html=cal_html+'   <div class="item">Вт</div>';        cal_html=cal_html+'   <div class="item">Ср</div>';        cal_html=cal_html+'   <div class="item">Чт</div>';        cal_html=cal_html+'   <div class="item">Пт</div>';        cal_html=cal_html+'   <div class="item">Сб</div>';        cal_html=cal_html+'   <div class="item">Вс</div>';        cal_html=cal_html+'</div>';        days = new Date(year, month, 0).getDate()         console.log("Дней в месяце:",days);        // рисуем, пока не кончатся дни        day=1;        while (day<=days) {           cal_html=cal_html+'<div class="calendar_row">';             for(let dayw = 1; dayw <= 7; dayw++) {                         if (GetDayWork(year, month, day)==dayw){                                if (day>days){                   console.log("- пропуск");                     cal_html=cal_html+'<div class="item"></div>';                   } else {                   console.log(day);                     available="available";                   selected="";                   if (month<(new Date().getMonth()+1)) available=""; //если месяц меньше чем текущий                   if (month==(new Date().getMonth()+1)){                       if (day<new Date().getDate()) available="";                       if (day==new Date().getDate()) selected="selected today";                   };                   cal_html=cal_html+'<div id="day_'+year+'_'+month+'_'+day+'" onclick="ChangeDataForBooking('+year+','+month+','+day+')" class="item '+available+' '+selected+'" data-date="'+year+'-'+month+'-'+day+'">'+day+'</div>';                 };                               day++;             } else {               console.log("- пропуск");                 cal_html=cal_html+'<div class="item"></div>';               };                     };             cal_html=cal_html+'</div>';         };               cal_html=cal_html+'<div class="booking_date-current_date">';        cal_html=cal_html+'   Пятница <span>21.01.2022 январь</span>';        cal_html=cal_html+'</div>';        $(".booking_date-wrapper").html(cal_html);     };     function ChangeDataForBooking(year,month,day){        console.log("!ChangeDataForBooking",year,month,day);         if ($('#day_'+year+'_'+month+'_'+day).hasClass("available")){          $(".item").removeClass("selected");             $('#day_'+year+'_'+month+'_'+day).addClass("selected");        };     }; |