Skip to content
Advertisement

Css element does not become active

I’m new to Css and javascript and currently working on a simple project (kinda like a weekly task manager). I created text/html page which contains navbar, 7 dynamic <ul> with “Add task” and “Delete Task buttons”, and each <li> inside of those lists can change it’s state to .active on click (when task is done). However, if i put li manually it works fine, but if I use javascript and button to add new <li> it’s just won’t become active.

function addTask() {
  var ul = document.getElementById("mondayList")
  var li = document.createElement("li")
  li.className = 'todo'
  li.appendChild(document.createTextNode("TaskName"));
  ul.appendChild(li);
}
const todos = document.querySelectorAll(".todo");
const togglers = document.querySelectorAll(".toggler");


todos.forEach((todo) => {
  todo.addEventListener("click", () => {
    todo.classList.toggle('active');
  })
})

togglers.forEach((toggler) => {
  toggler.addEventListener("click", () => {
    toggler.classList.toggle('active');
    toggler.nextElementSibling.classList.toggle('active');
  })
})
.todos {
  font-family: "Segoe UI fw-semibold", Tahoma, serif;
  font-size: 1.5rem;
  padding: 5rem;
}

ul {
  list-style-type: none;
}

.todos {
  cursor: pointer;
}

.todo::before {
  content: "2610";
  display: inline-block;
  margin-right: 0.5rem;
}

.todo.active::before {
  content: "2611";
}

.todo.active {
  text-decoration: line-through;
  color: #888;
}

.toggler::before {
  content: "25B6";
  display: inline-block;
  margin-right: 0.5rem;
  transition: transform 0.3s ease-in-out;
}

.toggler.active::before {
  transform: rotate(90deg);
}

.toggler-target {
  display: none;
}

.toggler-target.active {
  display: inline-block;
}
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.0/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-gH2yIJqKdNHPEq0n4Mqa/HGKIhSkIHeL5AyhkYV8i59U5AR6csBvApHHNl/vI1Bx" crossorigin="anonymous" />
<link href="/css/style.css" rel="stylesheet">
<!------Скрипты для развертывания навбара-->
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.11.5/dist/umd/popper.min.js" integrity="sha384-Xe+8cL9oJa6tN/veChSP7q+mnSPaj5Bcu9mPX5F5xIGE0DVittaqT5lorf0EI7Vk" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.0/dist/js/bootstrap.min.js" integrity="sha384-ODmDIVzN+pFdexxHEHFBQH3/9/vQ9uori45z4JjnFsRydbmQbmL5t1tQ0culUzyK" crossorigin="anonymous"></script>

<nav class="navbar navbar-expand-lg bg-light">
  <div class="container">
    <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
            <span class="navbar-toggler-icon"></span>
        </button>
    <div class="collapse navbar-collapse" id="navbarNav">
      <ul class="navbar-nav">
        <li class="nav-item">
          <a class="nav-link" aria-current="page" href="/home">Home</a>
        </li>
        <li class="nav-item">
          <a class="nav-link active" href="/test">InobitecTest </a>
        </li>
      </ul>
    </div>
  </div>
</nav>
<div class="unfold">
  <button class="btn btn-dark">[+]Unfold[+]</button>
</div>
<div style="margin: auto">
  <ul class="todos" id="todos" style="display: inline-block;margin-left: 786px;padding-top: 0px">
    <li>
      <div class="toggler">Monday</div>
      <ul class="toggler-target" id="mondayList">
        <li>
          <a class="btn btn-primary fw-light" onclick="addTask()">Add Task</a>
          <a class="btn btn-danger fw-light">DeleteTask</a>
        </li>
        <li class="todo">Task1</li>
      </ul>
    </li>
    <li>
      <div class="toggler" id="tuesdayList">Tuesday</div>
      <ul class="toggler-target">
        <li>
          <a class="btn btn-primary fw-light">Add Task</a>
          <a class="btn btn-danger fw-light">DeleteTask</a>
        </li>
      </ul>
    </li>
    <li>
      <div class="toggler" id="wednesdayList">Wednesday</div>
      <ul class="toggler-target">
        <li>
          <a class="btn btn-primary fw-light">Add Task</a>
          <a class="btn btn-danger fw-light">DeleteTask</a>
        </li>
      </ul>
    </li>
    <li>
      <div class="toggler">Thursday</div>
      <ul class="toggler-target" id="thurstdayList">
        <li>
          <a class="btn btn-primary fw-light">Add Task</a>
          <a class="btn btn-danger fw-light">DeleteTask</a>
        </li>
      </ul>
    </li>
    <li>
      <div class="toggler" id="fridayList">Friday</div>
      <ul class="toggler-target">
        <li>
          <a class="btn btn-primary fw-light">Add Task</a>
          <a class="btn btn-danger fw-light">DeleteTask</a>
        </li>
      </ul>
    </li>
    <li>
      <div class="toggler">Saturday</div>
      <ul class="toggler-target" id="saturdayList">
        <li>
          <a class="btn btn-primary fw-light">Add Task</a>
          <a class="btn btn-danger fw-light">DeleteTask</a>
        </li>
      </ul>
    </li>
    <li>
      <div class="toggler">Sunday</div>
      <ul class="toggler-target" id="sundayList">
        <li>
          <a class="btn btn-primary fw-light">Add Task</a>
          <a class="btn btn-danger fw-light">DeleteTask</a>
        </li>
      </ul>
    </li>
  </ul>
  <script src="/js/script.js" defer charset="UTF-8"></script>
</div>

Advertisement

Answer

You need to delegate

this code replaces all other code than function addTask() {

document.getElmentById("todos").addEventListener("click",function(e) {
  const tgt = e.target;
  if (tgt.matches(".todo")) tgt.classList.toggle('active');
  else if (tgt.matches(".toggler")) {
     tgt.classList.toggle('active');
     tgt.nextElementSibling.classList.toggle('active');
  }
})
User contributions licensed under: CC BY-SA
8 People found this is helpful
Advertisement