Чтобы решить вашу проблему с обновлением календаря без создания дубликатов и пустых `div`, вам нужно очищать содержимое контейнера с датами перед добавлением новых дат. Вместо удаления всех элементов или использования `innerHTML`, вы можете использовать метод `replaceChildren()` для замены содержимого, сохраняя при этом структуру вашего календаря.
Вот пример кода, который показывает, как можно изменить функцию `updateCalendar` для правильного отображения дат без создания лишних элементов. Мы будем использовать `datesElement.replaceChildren()` для очистки только контейнера с датами:
```javascript
const monthYearElement = document.getElementById('monthYear');
const datesElement = document.getElementById('dates');
const prevBtn = document.getElementById('prevBtn');
const nextBtn = document.getElementById('nextBtn');
let currentDate = new Date();
const updateCalendar = () => {
const currentYear = currentDate.getFullYear();
const currentMonth = currentDate.getMonth();
const firstDay = new Date(currentYear, currentMonth, 1);
const lastDay = new Date(currentYear, currentMonth + 1, 0);
const totalDays = lastDay.getDate();
const firstDayIndex = firstDay.getDay();
const lastDayIndex = lastDay.getDay();
const monthYearString = currentDate.toLocaleString('ru-RU', { month: 'long', year: 'numeric' });
monthYearElement.textContent = monthYearString;
// Очищаем содержимое контейнера с датами перед добавлением новых
datesElement.replaceChildren();
// Добавляем пустые div до первого дня месяца
for (let i = 0; i < firstDayIndex; i++) {
const emptyDiv = document.createElement('div');
emptyDiv.classList.add('date', 'inactive');
datesElement.appendChild(emptyDiv);
}
// Добавляем числа текущего месяца
for (let i = 1; i <= totalDays; i++) {
const date = new Date(currentYear, currentMonth, i);
let day = document.createElement('div');
day.classList.add('date');
day.textContent = `${date.getDate()}`;
datesElement.appendChild(day);
}
// При необходимости, добавляем пустые div до последнего дня недели
for (let i = lastDayIndex + 1; i < 7; i++) {
const emptyDiv = document.createElement('div');
emptyDiv.classList.add('date', 'inactive');
datesElement.appendChild(emptyDiv);
}
};
// Обработчики нажатий на кнопки
prevBtn.addEventListener('click', () => {
currentDate.setMonth(currentDate.getMonth() - 1);
updateCalendar();
});
nextBtn.addEventListener('click', () => {
currentDate.setMonth(currentDate.getMonth() + 1);
updateCalendar();
});
// Инициализация календаря
updateCalendar();
```
### Объяснение:
1. **Очищение контейнера**: В начале `updateCalendar()` используется `datesElement.replaceChildren()`, чтобы удалить все старые элементы внутри контейнера с датами, не затрагивая другие элементы.
2. **Добавление неактивных дат**: Мы добавляем пустые `div` для отображения неактивных дат перед первым и после последнего дня месяца, чтобы сохранить правильное форматирование календаря.
3. **Обработчики событий**: Кнопки "предыдущий" и "следующий" обновляют текущую дату и перерисовывают календарь.
Таким образом, вы избежите создания лишних элементов и дублирования информации в вашем календаре.