Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to add new created element in a NodeList?

I am making a ToDo Application from HTML, CSS and JavaScript.

I have added a symbol in front of every list item, such that when clicked, it removes the list item.

The problem is when I try to remove pre-added list items, it works perfectly fine, but when I add a list item and then remove it, it doesn't work :(

Have a look at my code:

const toDoInput = document.querySelector("input");
const addButton = document.querySelector("button");
const listParent = document.querySelector("ul");
const removeLists = document.querySelectorAll(".remove-li");

const listItemMake = () => {
  if (toDoInput.value !== "") {
    const newDiv = document.createElement("div");
    newDiv.classList.add("list-item");
    const newListItem = document.createElement("li");
    newListItem.append(toDoInput.value);
    newDiv.append(newListItem);
    toDoInput.value = "";
    const newSpan = document.createElement("span");
    newSpan.classList.add("remove-li");
    newSpan.innerHTML = '(Remove Button)';
    newDiv.append(newSpan);
    listParent.append(newDiv);
  }
};

addButton.addEventListener("click", () => {
  listItemMake();
});

toDoInput.addEventListener("keydown", (event) => {
  if (event.code === "Enter") {
    listItemMake();
  }
});

for (const removeList of removeLists) {
  removeList.addEventListener("click", () => {
    removeList.parentElement.remove();
  })
}
<h1>ToDo Application</h1>
<div class="container">
  <div class="form-container">
    <input type="text" placeholder="Add New Tasks">
    <button>Add</button>
  </div>
  <div class="list-container">
    <ul>
      <div class="list-item">
        <li>Sample List Item</li>
        <span class="remove-li">(Remove Button)</span>
      </div>
      <div class="list-item">
        <li>Sample List Item</li>
        <span class="remove-li">(Remove Button)</span>
      </div>
      <div class="list-item">
        <li>Sample List Item</li>
        <span class="remove-li">(Remove Button)</span>
      </div>
    </ul>
  </div>
</div>

While I was trying to fix this issue by myself in Chrome Dev Tools, I realised that my newly created list-item do contain the remove-list button, but the remove-list button is never added in the remove-lists list. My whole fuction to remove list items is based on remove-list and hence it doesn't work. Although, I don't know how to add that element in the list.

Also, I don't really know the name of the list I'm declaring on the first 4 lines. What exactly is toDoInput (declaring on line 1)? I don't think it's an array because though I can iterate over it, I can't really use methods like push & pop. What exactly is the term, and what is the difference?

Help Appreciated :)

like image 551
Adarsh Dubey Avatar asked Dec 19 '25 16:12

Adarsh Dubey


2 Answers

You need to listen for click event on newly added element. hence added a click listener on newSpan element after adding it into DOM.

You are listening for event for removeLists element only but when you add a new element in the DOM, the newly doesn't have the click event. Hence, we have to listen for the event explicitly.

I hope, it answers your question. :)

const toDoInput = document.querySelector("input");
const addButton = document.querySelector("button");
const listParent = document.querySelector("ul");
const removeLists = document.querySelectorAll(".remove-li");

const listItemMake = () => {
  if (toDoInput.value !== "") {
    const newDiv = document.createElement("div");
    newDiv.classList.add("list-item");
    const newListItem = document.createElement("li");
    newListItem.append(toDoInput.value);
    newDiv.append(newListItem);
    toDoInput.value = "";
    const newSpan = document.createElement("span");
    newSpan.classList.add("remove-li");
    newSpan.innerHTML = '(Remove Button)';
    newDiv.append(newSpan);
    listParent.append(newDiv);
    newSpan.addEventListener("click", () => {
      newSpan.parentElement.remove();
    });
  }
};

addButton.addEventListener("click", () => {
  listItemMake();
});

toDoInput.addEventListener("keydown", (event) => {
  if (event.code === "Enter") {
    listItemMake();
  }
});

for (const removeList of removeLists) {
  removeList.addEventListener("click", () => {
    removeList.parentElement.remove();
  })
}
<h1>ToDo Application</h1>
<div class="container">
  <div class="form-container">
    <input type="text" placeholder="Add New Tasks">
    <button>Add</button>
  </div>
  <div class="list-container">
    <ul>
      <div class="list-item">
        <li>Sample List Item</li>
        <span class="remove-li">(Remove Button)</span>
      </div>
      <div class="list-item">
        <li>Sample List Item</li>
        <span class="remove-li">(Remove Button)</span>
      </div>
      <div class="list-item">
        <li>Sample List Item</li>
        <span class="remove-li">(Remove Button)</span>
      </div>
    </ul>
  </div>
</div>
like image 153
Bharat Choudhary Avatar answered Dec 21 '25 06:12

Bharat Choudhary


Please change some code. Please add remove event function to listItemMake() function.

const toDoInput = document.querySelector("input");
const addButton = document.querySelector("button");
const listParent = document.querySelector("ul");

const listItemMake = () => {
  if (toDoInput.value !== "") {
    const newDiv = document.createElement("div");
    newDiv.classList.add("list-item");
    const newListItem = document.createElement("li");
    newListItem.append(toDoInput.value);
    newDiv.append(newListItem);
    toDoInput.value = "";
    const newSpan = document.createElement("span");
    newSpan.classList.add("remove-li");
    newSpan.innerHTML = '(Remove Button)';
    newDiv.append(newSpan);
    listParent.append(newDiv);
  }
  addRemoveEvent();
};

addButton.addEventListener("click", () => {
  listItemMake();
});

toDoInput.addEventListener("keydown", (event) => {
  if (event.code === "Enter") {
    listItemMake();
  }
});

function addRemoveEvent() {
  const removeLists = document.querySelectorAll(".remove-li");
  for (const removeList of removeLists) {
    removeList.addEventListener("click", () => {
      removeList.parentElement.remove();
    })
  }
}

addRemoveEvent();
<h1>ToDo Application</h1>
<div class="container">
  <div class="form-container">
    <input type="text" placeholder="Add New Tasks">
    <button>Add</button>
  </div>
  <div class="list-container">
    <ul>
      <div class="list-item">
        <li>Sample List Item</li>
        <span class="remove-li">(Remove Button)</span>
      </div>
      <div class="list-item">
        <li>Sample List Item</li>
        <span class="remove-li">(Remove Button)</span>
      </div>
      <div class="list-item">
        <li>Sample List Item</li>
        <span class="remove-li">(Remove Button)</span>
      </div>
    </ul>
  </div>
</div>
like image 42
Kirill Savik Avatar answered Dec 21 '25 06:12

Kirill Savik



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!