Цивільно-імперські послуги; структурне будівництво
Створення календаря подій за допомогою Javascript з графіком перетягування та відпускання
Table of Contents
Вступ до JavaScript Календар подій з Драго-енд-Дро
Інтерактивний західний розклад є основною особливістю багатьох веб-додатків, від інструментів управління проектами до систем бронювання. Будівля календаря на замовлення з JavaScript дає вам повну контроль над досвідом користувача, витратою даних та візуальним дизайном. Інтерфейс перетягування перетворює статичну сітку в рідину, інтуїтивно зрозумілий інструмент, де користувачі можуть перепланувати події просто переміщаючи їх між датами. Ця стаття досліджує архітектуру, стратегії реалізації та найкращі практики створення календаря подій продакшн-редуктора, який підтримує перетягування та розширення часу.
Основні напрямки: Структура даних та моніторинг календарів
Модель даних заходу
Кожен календар починається з подій. Надійний об'єкт заходу повинен включати в мінімум ідентифікатор, назву, дату початку та час закінчення. Для перетягування та вилучення також потрібно ідентифікатор, щоб відстежувати елемент у DOM. Розглянемо додаткові поля, такі як колір, опис та правила рецидиву.
{
id: 1,
title: "Team Standup",
start: "2025-10-27T09:00:00",
end: "2025-10-27T09:30:00",
color: "#4A90D9",
location: "Room 301"
}
Зберігати події в масиві або використовувати шаблон державного управління. Коли подія впав на новий день або час, тільки і властивості змін.
Рендеринг календарної сітки
Щомісячна сітка є зазвичай 7-ти поверховий стіл (або flexbox/grid макет) з рядами на тижні. Генерувати денні клітини динамічно базуються на першому день поточного місяця і кількості днів. Кожна клітинка повинна тримати масив подій на цю дату. Використовуйте об'єкт JavaScript , щоб розрахувати офсети і порівняти дати події. Попередньо заповнювати порожні клітинки для насипання днів для підтримки вирівнювання.
Для щотижневих або щоденних переглядів, поділіть сітку на часові слоти (наприклад, 30-хвилинні інтервали). Діалоги набирає більш складний, але слідувати таким же принципом: на карті ресурсу часу до візуального положення.
Реалізація Drag-and-Drop з HTML5 API
EnglishDeutschPусский简体中文中國傳統EspañolالعربيةFrançaisελληνικάDanskАнглійскаябългарскиCatalàČeskýEestiSuomiGaeilgeहिन्दीHrvatskiMagyarIndonesiaIcelandicItalianoעברי日本の한국의LietuvosLatvijasмакедонскиMalayMaltiNederlandsNorskPolskiPortuguêsRomânescSlovenskýSlovenskiShqiptarCрпскиSvenskaไทยTürkçeYкраїнськийTiếng việtייִדישKiswahili
Виготовлення елементів Перетягування
На сайті обробник, зберігайте ідентифікатор заходу за допомогою і додатково встановіть перетягування зображення.
eventElement.addEventListener('dragstart', (e) => {
e.dataTransfer.setData('text/plain', event.id);
e.dataTransfer.effectAllowed = 'move';
// Add a class to visually indicate dragging
e.target.classList.add('dragging');
});
Визначення зони падіння
Кожен день клітинка (або слот часу) повинна слухати (з , щоб дозволити скидання) і . Репульвертор отримує ідентифікатор події, розташує захід у вашому магазині даних, і оновлення його дати. Потім перерендер календаря або переміщення елемента DOM.
dayCell.addEventListener('dragover', (e) => {
e.preventDefault();
e.dataTransfer.dropEffect = 'move';
});
dayCell.addEventListener('drop', (e) => {
e.preventDefault();
const eventId = Number(e.dataTransfer.getData('text/plain'));
const targetDate = e.currentTarget.dataset.date; // e.g. "2025-10-27"
// Update the event in your data array
const event = events.find(ev => ev.id === eventId);
if (event) {
event.start = new Date(targetDate + 'T' + extractTime(event.start));
event.end = new Date(targetDate + 'T' + extractTime(event.end));
reRenderCalendar();
}
});
Рукаючий край Кейси
- Cross-month drops: Коли драпірування події з одного місяця в інший, забезпечення оновлення календаря відповідно або навігації в цільовий місяць.
- Попередня подія: Після падіння перевірте часові конфлікти. Якщо перекриття не дозволено, перевернути крапку і показати повідомлення.
- Cancel Drop: Слухати для очищення перетягного стану, якщо користувач випадає за межі дійсної зони.
- Multi-day події: Представляйте їх як пролонгування декількох клітин або одного широкого елемента. Перетягування одного кінця вимагає складної логіки; врахуйте обмеження перетягування до дати початку.
Додавання, редагування та видалення подій
Перетягніть і натисніть кнопку "Додати". Виправте необхідні поля і перевищіть новий захід. Для видалення, дайте контекстне меню правого кліку або значок сміття на поході.
Редагування операцій повинна відкрити попередньо заповнену форму, де користувачі можуть змінити назву, час, колір та інші атрибути. Після збереження, оновлення події в магазині даних і повторно відредагувати тільки уражені клітини для підтримки продуктивності.
Постійні дані подій
Клієнт-Side Storage
Для простих додатків без задньої частини використовуйте , щоб зберегти події як рядок JSON. Посвідомити і десеріалізованіізувати навантаження і на кожну зміну. Це підходить для однокористувацького інструмента або прототипів. Для збільшення даних IndexedDB] пропонує асинхронний, ключовий значення зберігання з можливістю запиту.
Синхронізація енденду
У додатках для виробництва, події повинні бути збережені на сервері. Використовуйте REST або GraphQL API для fetch та оновлення подій. Перевірити оновлення з патологія запобігає втраті даних при мережевих збах. Включаючи оптимістичні оновлення в UI, під час очікування підтвердження сервера, після чого відключення помилки.
Час побудови слотів (Week і день)
Календар місяця працює для оглядів, але точний розклад вимагає погодинної гранульації. Побудувати тиждень або день з видом на вертикальну лінію часу. Кожен день стовпчик ділиться на слоти (наприклад, 30-хвилинні інтервали). Події позиціонуються абсолютно на основі часу початку і висоти пропорційно тривалості.
Перетягніть і виведіть цей вид, щоб поважати як дату, так і час. Коли подія скидається на слоті, розрахуйте новий час запуску з часової точки слота. Забезпечте захід не переповнено межі календаря (наприклад, перетягніть минуле півня). Ви можете обмежити падіння цілей тільки для коректних часових слотів.
Зручний дизайн та мобільні характеристики
Пристрої сенсорні не підтримують HTML5 Drag і Drop API рідно. Для мобільних дружних календарів реалізуються сенсорні події (, , ) вручну або використовувати бібліотеку, як Sortable.js], які анотації перевстановлюють драгінацію. Крім того, запади до «клацання вибрати, потім натисніть кнопку призначення».
Використовуйте CSS медіа-питання для налаштування макета календара: укладні дні вертикально на невеликих екранах, приховати часовий стовпчик і показати тільки назви подій. Забезпечити сенсорні цілі принаймні 48x48px.
Доступність (a11y) у Календарі Драго-енд-Дrop
Перетягніть і викрадати можна недоступним користувачам, які спираються на клавіатури або зчитувачі екрана. Забезпечте альтернативні методи: клавіші стріли для переміщення події або «згодити на дату» випадаючою. Використовуйте атрибути ARIA, такі як , ]] на кожній клітинці, і оголосіть краплі через живі регіони. Для клавіатурної підтримки, призначаємо таксидку для карток подій та ручки Enter/Space, щоб почати рух режим, потім клавіші стріли, щоб перейти до цільової комірки, і введіть до падіння.
Сонцезахисні вироби з дель-Петер
Будівля з нуля дає вам повну гнучкість, але це трудомісткий. Розглянемо ці популярні варіанти відкритого коду:
- ПовнийКалендар] – Найпопулярніші бібліотеки з перетягуванням та відведенням часу, переглядом часу та заміною Vue/React. Підходить для додатків підприємства.
- react-big-calendar – React компонент з схожими функціями, дуже настроюється.
- ]Sortable.js – легка бібліотека перетягування та викопування, яка працює з будь-яким HTML. Відмінно для додавання перетягування на спеціальні календарі без логіки рерайтингу.
- DayPilot – Комерційний, але пропонує розширені планки з перетягуванням та викопуванням з коробки.
Оцінити ваші вимоги: якщо вам потрібно лише базові щомісячні перетягування, ванільний JS є достатнім. Якщо вам потрібно будувати / день переглядів, повторювані події та календарі ресурсів, бібліотека збереже місяці розвитку.
Оптимізація продуктивності
Календарі можуть надати сотні заходів. Оптимізуйте:
- Відступ тільки на видимі місяці або тижні (поворотний прокрутка для великих даних).
- Використання при перетягування, щоб уникнути розтягування макета.
- Виявлення ре-рендерів після перепаду або зміни розміру.
- Знімання позицій події в часових стоках.
Для великих холів подій, пакетних оновлень та використання при вставці безліч вузлів DOM.
Тестування календаря
Драго-і-drop неорічно флакитна в автоматизованих тестах. Використовуйте помічників в блок-тестах для логіки даних, а також розглянути cypress або playwright з користувальницьких команд, які вогненна миша, мишолово, миша. Випробування крайових випадків: перетягування вже зайнятого слота, перетягування на дату вимкнення, перетягування на інший місяць, а швидке послідовне падіння.
Зовнішні ресурси
Будуємо календар подій з перетягуванням і розтягом є корисним викликом, який поглиблює вашу розуміння маніпуляції DOM, управління державами та шаблонів взаємодії користувачів. З початку моделі твердих даних та прогресивно додаючи функції, такі як слоти часу, наполегливість та доступність, ви можете створити інструмент, який відповідає як очікування користувачів, так і вимогам виробництва.