Выведите даты всех пятниц 13-е заданного года в виде списка ul при повторном введении другого года

Дан инпут. В него вводится год. Выведите даты всех пятниц 13-е заданного года в виде списка ul.

Я написал следущий код:

<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8" />
</head>

<body>
  <input id="input" />
  <ul></ul>
  <script>
    let date = document.getElementById("input");

    let ul = document.querySelector("ul");

    document.getElementById("input").addEventListener("blur", function() {
      let year = date.value;
      let array = [];
      for (let month = 0; month < 12; month++) {
        let d = new Date(year, month, 13);
        if (d.getDay() == 5) {
          array.push(d);
        }
      }
      for (const friday of array) {
        let newListItem = document.createElement("li");
        newListItem.textContent = newListItem.textContent =
          friday.toLocaleString(undefined, {
            day: "numeric",
            month: "long",
          });
        ul.appendChild(newListItem);
      }
    });
  </script>
</body>

</html>

С задачей я справился, при введении первого года выводятся все даты пятниц 13го, но если ввести другой год, к уже введенным датам прибавляются даты другого года (и это нормально, так как при нажатии на кнопку запускается функция, которая создает новый li и добавляет его в список). Поэтому я решил написать следующий код, в котором проводится:

<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8" />
</head>

<body>
  <input id="input" />
  <ul></ul>
  <script>
    let date = document.getElementById("input");

    let ul = document.querySelector("ul");

    document.getElementById("input").addEventListener("blur", function() {
      let year = date.value;
      let array = [];
      for (let month = 0; month < 12; month++) {
        let d = new Date(year, month, 13);
        if (d.getDay() == 5) {
          array.push(d);
        }
      }
      if (ul.textContent.length === 0) // Проверка на пустоту ul
        for (const friday of array) {
          let newListItem = document.createElement("li"); // создание нового li
          newListItem.textContent = newListItem.textContent =
            friday.toLocaleString(undefined, {
              day: "numeric",
              month: "long",
            });
          ul.appendChild(newListItem); // добавление нового li в список при первой работе функции
        }
      else { // здесь я пытаюсь обновлять значения, если список не пустой
        let lis = document.querySelectorAll("li"); // ищу все li
        for (const li of lis) { // перебираю их
          for (const friday of array) // заново перебираю все пятницы  13 из массива
            li.textContent = li.textContent = friday.toLocaleString(undefined, {
              day: "numeric",
              month: "long",
            }); // меняю содержимое li на новые данные
          ul.appendChild(li) // думал, что добавляю измененное значение в список, но выходит дичь
        }
      }
    });
  </script>
</body>

</html>

Как обновлять уже введенные данные?


Ответы (2 шт):

Автор решения: Dev18

так у вас почти все получилось же всё. Недочет в том, что вы в попытке обновить список вместо того, чтобы просто заменить его содержимое, добавляете новые элементы, что приводит к неожиданным результатам

  1. При каждом вводе нового года нужно просто очищать старые элементы списка перед тем, как добавлять новые

  2. Также надо пересоздавать список, а не заменять содержимое каждого li

let date = document.getElementById("input");
let ul = document.querySelector("ul");

document.getElementById("input").addEventListener("blur", function() {
  let year = date.value;

  // Очищаем предыдущий список перед добавлением новых элементов
  ul.innerHTML = '';

  let array = [];
  for (let month = 0; month < 12; month++) {
    let d = new Date(year, month, 13);
    if (d.getDay() === 5) {
      array.push(d);
    }
  }

  // Добавляем новые элементы в список
  for (const friday of array) {
    let newListItem = document.createElement("li");
    newListItem.textContent = friday.toLocaleString(undefined, {
      day: "numeric",
      month: "long",
    });
    ul.appendChild(newListItem);
  }
});
<!DOCTYPE html>
<html lang="ru">

<head>
  <meta charset="utf-8" />
  <title>Пятницы 13-го</title>
</head>

<body>
  <input id="input" type="number" placeholder="Введите год" />
  <ul></ul>

</body>

</html>

→ Ссылка
Автор решения: ksa

Можно просто очистить список и потом добавлять элементы...

Предложу еще такой вариант.

const date = document.getElementById("input");

const ul = document.querySelector("ul");

date.addEventListener("blur", function() {
  const year = this.value;
  ul.innerHTML = ''
  new Array(12)
    .fill(13)
    .forEach((v, i) => {
      let d = new Date(year, i, v)
      if (d.getDay() != 5) return
      d = d.toLocaleString(undefined, {
        day: "numeric",
        month: "long",
      })
      ul.insertAdjacentHTML('beforeend', `<li>${d}</li>` )
    }, [])
});
<input id="input" />
<ul></ul>

→ Ссылка