Как подсчитать элементы в списке в Vanilla Javascript?

Я хочу создать счетчик для моего списка дел. Он показывает количество всех предметов. Но он не обновляется, когда я добавляю элемент. Остается на 3.

Это мой код Javascript;

var count = document.getElementById("list").childElementCount;
document.getElementById("title").innerHTML = ("You have " + count + " to-dos.");

// add item 
function todoList() {
    var item = document.getElementById("todoInput").value
    var text = document.createTextNode(item)
    var newItem = document.createElement("li")
    var check = document.createElement("span")
    check.className = "circle"
    newItem.appendChild(check)
    newItem.appendChild(text)
    document.getElementById("list").appendChild(newItem)

    // clear input value 
    document.getElementById("todoInput").value = "";
}

document.getElementById("add").addEventListener('click', todoList, null);

Это мой HTML-код;

<div class = "progress">
    <div id = "title"></div>
</div>

<ul id = "list">
    <li><span class = "circle"></span>Buid a task app</li>
    <li><span class = "circle"></span>Do exercise</li>
    <li><span class = "circle"></span>Buy headphones</li>
</ul>

Вам нужно показать свой код, где вы добавляете элемент - вам, вероятно, нужно снова запустить тот бит js, который вы показываете

Pete 15.04.2019 13:17

"он не обновляется, когда я добавляю элемент" Покажите нам этот код обновления.

takendarkk 15.04.2019 13:18

Хорошо, да, вам нужно снова запустить код в вашем todolist — вы запускаете его только один раз, поэтому, когда вы меняете дом, вам нужно запускать его снова — он не будет волшебным образом обновляться только потому, что вы обновляете дом

Pete 15.04.2019 13:24

Я добавил код.

Ramazan Erikli 15.04.2019 13:25
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
4
1 333
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Просто повторите количество детей внутри функции todoList()

 var count = document.getElementById("list").childElementCount;
  document.getElementById("title").innerHTML = ("You have " + count + " to-dos.");

// add item 
function todoList() {
  var item = document.getElementById("todoInput").value
  var text = document.createTextNode(item)
  var newItem = document.createElement("li")
  var check = document.createElement("span")
  check.className = "circle"
  newItem.appendChild(check)
  newItem.appendChild(text)
  document.getElementById("list").appendChild(newItem)


  count = document.getElementById("list").childElementCount;
  document.getElementById("title").innerHTML = ("You have " + count + " to-dos.");

  // clear input value 
  document.getElementById("todoInput").value = "";

}

document.getElementById("add").addEventListener('click', todoList, null);

или вы можете прочитать о Геттеры и сеттеры в javascript

Ответ принят как подходящий

Сухой метод заключается в создании функции, которую вы можете вызывать, поэтому вам не нужно дублировать какой-либо код.

// Cache your elements
const title = document.getElementById('title');
const list = document.getElementById('list');
const input = document.getElementById('todoInput');
const add = document.getElementById('add')

// A new updateCount function
function updateCount() {
  const count = list.childElementCount;

  // Using a template literal is tidier than string concatenation
  // https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Template_literals
  title.innerHTML = `You have ${count} to-dos.`;
}

function todoList() {
  const item = input.value
  const text = document.createTextNode(item)
  const newItem = document.createElement('li')
  const check = document.createElement('span')
  check.className = 'circle'
  newItem.appendChild(check)
  newItem.appendChild(text)
  list.appendChild(newItem)
  input.value = '';

  // Call your updateCount function after a new item
  // has been added
  updateCount();
}

// Call updateCount initially when the page loads
updateCount();
add.addEventListener('click', todoList, false);
<div class = "progress">
  <div id = "title"></div>
</div>

<ul id = "list">
  <li><span class = "circle"></span>Build a task app</li>
  <li><span class = "circle"></span>Do exercise</li>
  <li><span class = "circle"></span>Buy headphones</li>
</ul>

<input id = "todoInput" />
<button id = "add">Add</button>

Другие вопросы по теме