Задать вопрос
@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");
			}

но не работает.
Заранее большое спасибо!
  • Вопрос задан
  • 147 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 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 - тогда числа предыдущего месяца, формально не подходящие под условие, всё равно будут обработаны, так как тело цикла выполняется до проверки условия.

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

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

https://jsfiddle.net/c83kedtm/
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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