Задать вопрос
@Gor321

Ошибка в коде при переключении месяца в календаре?

Здравствуйте! Помогите пожалуйста устранить ошибку при переключении месяца в календаре на чистом js.
В консоле выдает Uncaught TypeError: next is not a function
https://jsfiddle.net/furcifer21/6bac25ms/11/

И еще маленький вопросик, буду рад если подскажите.
Как выделить при помощи класса текущее число, не выходит
добавляю
if (currDay === today.getDate() && year === today.getFullYear() && month === today.getMonth()) {
				currDay.classList.add("today");
			}

но не работает.
Заранее большое спасибо!
  • Вопрос задан
  • 166 просмотров
Подписаться 1 Простой Комментировать
Помогут разобраться в теме Все курсы
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
  • Яндекс Практикум
    Фронтенд-разработчик расширенный
    13 месяцев
    Далее
  • Skillbox
    JavaScript
    3 месяца
    Далее
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
В консоле выдает Uncaught TypeError: next is not a function

Вы обработчики подключили инлайново, а по умолчанию jsfiddle оборачивает код в window.onload - вот они и отсутствуют в глобальной области видимости. Назначайте обработчики с помощью addEventListener; или, в верхней части окна с js кодом есть выпадающее меню, открываете его, находите пункт "load type", выставляете значение "No wrap - bottom of < body >". UPD. Неактуально, исправили эту дичь с onload, теперь js код всегда добавляется как есть.

Как выделить при помощи класса текущее число, не выходит
добавляю...

Это безумие - currDay является датой, а вы пытаетесь работать с ней как с DOM нодой, classList.add, бред какой-то. Ну и само условие неправильное - год и месяц вы всегда при проверке используете одни и те же, где тут currDay? Должен быть. А проверка числа - ещё одно безумие, вы его сравниваете с объектом даты. Ну и наконец, почему всё это происходит после цикла, откуда там будет доступна ячейка с сегодняшней датой? - проверяйте дату при создании разметки ячейки таблицы, и в зависимости от результата прямо туда, в разметку, добавляйте атрибут class.

Есть и ещё косяки:

Не очищаете содержимое #calendar-body при переключении месяца. Не хватает tbl.innerHTML = ''; перед циклом.

Условие продолжения цикла - currDay.getMonth() <= month. Представьте, что следующий месяц - январь, год кончается. Что будет с вашим условием? Правильно, оно останется истинным. Навсегда. Лучше сделать так: проверяете равенство, без "меньше", а while заменяете на do-while - тогда числа предыдущего месяца, формально не подходящие под условие, всё равно будут обработаны, так как тело цикла выполняется до проверки условия.

Зачем дни недели вписаны в первую неделю? - я бы их в заголовок таблицы (thead) вынес.

Размер календаря скачет. В зависимости от количества дней в месяце и дня недели первого числа количество недель может быть равно 4, 5 или 6. Пусть всегда будет 6. Да, будет показываться больше дней из соседних месяцев, но высота календаря перестанет изменяться при переключении месяца.

Вот так будет круто.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы