Рубрики
Без рубрики

Создание календаря в ванильном JavaScript

Манипулировать HTML, используя силу ванильного JavaScript. Tagged с JavaScript, начинающими, WebDev, Tutorial.

Возможно, время-лучшая и худшая встроенная функция в JavaScript. Для моего последнего проекта у меня была идея сделать ублюдшие календари Google. Я наивно подумал, что создание общего функционального календаря будет простым и даст мне достаточно времени, чтобы создать мой сайт. I так был неправ.

Когда начать?

Довольно рано, с руководством от моего инструктора, я решил жесткий код в месяц в HTML. Это позволило мне создать общую структуру и стиль, которые я хотел для своего календаря. Была противоречивая литература о том, использует ли использование

или <Таблица> было бы лучше практиковать. В конечном итоге я решил пойти со столом.

Если вы когда -либо нашли время, чтобы по -настоящему изучать календарь месяца, структура довольно проста. Наверху, как правило, есть заголовок, который указывает на месяц и год. Ниже приведены 7 столбцов с изложением индивидуальных дней недели. Наконец, существует максимум 6 строк, чтобы заполнить количество дней за определенный месяц.

Ниже приведен снимок моего жестко -кодированного HTML.

Опять же, это позволило мне связываться с листом стиля CSS, чтобы сделать общий вид и чувство, что я хотел для своего календаря.

Использовать силу времени

Теперь пришла тяжелая часть. Мне нужно было использовать встроенную функцию времени, чтобы заполнить точное количество дней за определенный месяц и год. После некоторого исследования я узнал, что JavaScript вернет число, которое соответствует месяцам относительного индекса в год: то есть январь 0, февраль – 1 и т. Д. И т. Д. Это можно назвать с помощью getMonth () Функция встроена в JavaScript.

JavaScript также делает то же самое со днями недели и начинается с воскресенья. Это делает воскресенье – 0, понедельник – 1 и т. Д. Это называется с помощью getDay () Функция из JavaScript.

Итак, вопрос стал, как я могу использовать эти два важных фрагмента информации: 1. Как понять, какой день недели начал месяц? 2. Как рассчитать, сколько дней в месяц?

Ответить на первые вопросы было достаточно простым. JavaScript Литература помог изложить различные варианты встроенных функций. Чудесным образом, Новая дата (год, месяц) невероятно мощный и автоматически окажет первый день данного года и месяца аргумента. Используя .getDay () Функция в этом позволила мне получить индекс дня на начало месяца.

Затем мне нужно было получить количество дней в определенный месяц. Опять же, я использовал всемогущий Новая дата () Чтобы начать меня, и, используя какую -то алгебру средней школы, я обратно разработал способ рассчитать общие дни. Новая дата () Функция может принять большое количество аргументов, вплоть до миллисекунды. Мне не нужно было становиться гранулированным с моим календарем, но думал, что я могу использовать месяц, год и дневные аргументы. Учитывая, что максимальное количество дней в любом месяце составляет 31 год, что в течение 32 дней в Новая дата () даст мне относительную дату, которая на самом деле будет в следующем месяце. Например, июль (индекс 6 года) имеет 31 день в месяц. Если я вошел Новая дата (2019, 6, 32) В мою консоли я ожидаю, что консоль вернется 1 августа 2019 года.

Новая дата () Функция также имеет getDate () Функция, которая вернет номер дня с данной даты. Используя это возвращаемое число, я вычитал его из 32, чтобы получить точное количество дней за определенный месяц.

Чтобы доказать мою концепцию, я использовал февраль 2019 года в своей консоли. Проходя в 2019 году за год, 1 за месяц и 32 за несколько дней, я должен ожидать, что вышеупомянутое уравнение вернется 28, так как в феврале 2019 года было 28 дней.

Одно препятствие, теперь мне пришлось использовать эти данные для заполнения и отображения своей таблицы.

Заполняя зверя

После удаления данных HTML с жесткой кодировкой из моей таблицы мне нужно было заполнить месяц SPAN и год SPAN с в настоящее время рендерируемым месяцем и год. Это было довольно просто, так как я оставил большую часть своего HTML -кода в заголовке. После поиска индивидуальных элементов SPAN с использованием document.findelementbyid () , Я изменил TextContent к данному месяц и год Анкет

После захвата элемента таблицы, снова используя Document.getElementById () , Тогда мне нужно было добавить немного для петли, чтобы отобрать мои ряды и столбцы. Я также знал, что мне нужно будет распечатать фактический номер дня в календаре. По очевидным причинам я начал счет в 1 и присвоил это 1 на полезную переменную, называемую rendernum Анкет (Примечание: эта переменная будет увеличена на один с каждым циклом столбца. Но я немного доберусь до этого)

Далее я сгенерировал ряд для петля, так как это будет держать все индивидуальные плитки свиданий. (Чтобы быть более правильным, я добавлю свою строку с данными моей таблицы Элементы.) Поскольку я знал, что мне понадобится максимум 6 рядов, я начал свой для петля на традиционном 0 и остановился, когда я достиг 6. Видя, что для строки не было текстового контента, все, что мне нужно, это создать элемент и назначьте это полезной переменной.

Как указывалось ранее, я хотел добавить каждую строку с 7 элементами данных таблицы. Это означало, что мне нужно было вложенное для петля. Этот 2 -й для Loop также начался с 0 и закончился, когда количество (C в этом случае) достиг 7. Это было достаточно просто, но следующий шаг сделал некоторые логические рассуждения. Помнит, что Новая дата (месяц, год) .getday () дал мне указатель дня недели, мне нужно было настроить пустое s так что подсчет и календарный рендеринг начался в правильный день. Для этого я добавил Если утверждение в моей колонке для Цикл, который проверит, если: 1 Цикл был в первом ряду (aka i === 0 ) и 2 Значение цикла счета было меньше, чем Новая дата (месяц, год) .getday () Значение (AKA C ).

Если оба этих условия были правдой, я хотел, чтобы петля создала Элемент, добавьте пусто класс в недавно отобранный и добавить это к текущему элементу строки.

Затем я хотел убедиться, что я заполнял правильный номер дня на каждом из новых элементов данных о таблице. Модифицируя мой пустой элемент TD Метод, я добавил Элемент для каждого нового дня добавил TextContent и добавил ряд. TextContent В этом случае будет rendernum переменная определена ранее. Чтобы убедиться, что rendernum Отпечатано правильную дату, я увеличил переменную на 1.

Используя силу правдивость , Я использовал иначе, если Заявление, чтобы остановить календарь от увеличения и добавления данных в последний день месяца.

Как только я достиг перерыв и был вне для Петли, мне нужно было убедиться, что добавить корпус стола с недавно сформированным и населенным рядом. ( Я изменил и группировал код в соответствии с переменными и моими личными предпочтениями. Очевидно, это не обязательно. Это было просто личное предпочтение. )

Наконец, я добавил EventListeners На щелчке стрел, чтобы переключаться до месяца до и после календарного снимка. Учитывая продолжительность этого поста, я вас пощаду. Но есть много Литература на EventListeners Что я рекомендую читать, если у вас есть проблемы с этим шагом.

Ниже приведен снимок календаря отображения. Я обязательно обновлю этот пост по ссылке GitHub, как только проект будет завершен.

Далее, встречи, часовые пояса и планирование. Пожелай мне удачи!

Оригинал: “https://dev.to/knheidorn/making-a-calendar-in-vanilla-javascript-48j8”