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.
JavaScript
x
23
23
1
function addTask() {
2
var ul = document.getElementById("mondayList")
3
var li = document.createElement("li")
4
li.className = 'todo'
5
li.appendChild(document.createTextNode("TaskName"));
6
ul.appendChild(li);
7
}
8
const todos = document.querySelectorAll(".todo");
9
const togglers = document.querySelectorAll(".toggler");
10
11
12
todos.forEach((todo) => {
13
todo.addEventListener("click", () => {
14
todo.classList.toggle('active');
15
})
16
})
17
18
togglers.forEach((toggler) => {
19
toggler.addEventListener("click", () => {
20
toggler.classList.toggle('active');
21
toggler.nextElementSibling.classList.toggle('active');
22
})
23
})
JavaScript
1
47
47
1
.todos {
2
font-family: "Segoe UI fw-semibold", Tahoma, serif;
3
font-size: 1.5rem;
4
padding: 5rem;
5
}
6
7
ul {
8
list-style-type: none;
9
}
10
11
.todos {
12
cursor: pointer;
13
}
14
15
.todo::before {
16
content: "2610";
17
display: inline-block;
18
margin-right: 0.5rem;
19
}
20
21
.todo.active::before {
22
content: "2611";
23
}
24
25
.todo.active {
26
text-decoration: line-through;
27
color: #888;
28
}
29
30
.toggler::before {
31
content: "25B6";
32
display: inline-block;
33
margin-right: 0.5rem;
34
transition: transform 0.3s ease-in-out;
35
}
36
37
.toggler.active::before {
38
transform: rotate(90deg);
39
}
40
41
.toggler-target {
42
display: none;
43
}
44
45
.toggler-target.active {
46
display: inline-block;
47
}
JavaScript
1
95
95
1
<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" />
2
<link href="/css/style.css" rel="stylesheet">
3
<!------Скрипты для развертывания навбара-->
4
<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>
5
<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>
6
7
<nav class="navbar navbar-expand-lg bg-light">
8
<div class="container">
9
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
10
<span class="navbar-toggler-icon"></span>
11
</button>
12
<div class="collapse navbar-collapse" id="navbarNav">
13
<ul class="navbar-nav">
14
<li class="nav-item">
15
<a class="nav-link" aria-current="page" href="/home">Home</a>
16
</li>
17
<li class="nav-item">
18
<a class="nav-link active" href="/test">InobitecTest </a>
19
</li>
20
</ul>
21
</div>
22
</div>
23
</nav>
24
<div class="unfold">
25
<button class="btn btn-dark">[+]Unfold[+]</button>
26
</div>
27
<div style="margin: auto">
28
<ul class="todos" id="todos" style="display: inline-block;margin-left: 786px;padding-top: 0px">
29
<li>
30
<div class="toggler">Monday</div>
31
<ul class="toggler-target" id="mondayList">
32
<li>
33
<a class="btn btn-primary fw-light" onclick="addTask()">Add Task</a>
34
<a class="btn btn-danger fw-light">DeleteTask</a>
35
</li>
36
<li class="todo">Task1</li>
37
</ul>
38
</li>
39
<li>
40
<div class="toggler" id="tuesdayList">Tuesday</div>
41
<ul class="toggler-target">
42
<li>
43
<a class="btn btn-primary fw-light">Add Task</a>
44
<a class="btn btn-danger fw-light">DeleteTask</a>
45
</li>
46
</ul>
47
</li>
48
<li>
49
<div class="toggler" id="wednesdayList">Wednesday</div>
50
<ul class="toggler-target">
51
<li>
52
<a class="btn btn-primary fw-light">Add Task</a>
53
<a class="btn btn-danger fw-light">DeleteTask</a>
54
</li>
55
</ul>
56
</li>
57
<li>
58
<div class="toggler">Thursday</div>
59
<ul class="toggler-target" id="thurstdayList">
60
<li>
61
<a class="btn btn-primary fw-light">Add Task</a>
62
<a class="btn btn-danger fw-light">DeleteTask</a>
63
</li>
64
</ul>
65
</li>
66
<li>
67
<div class="toggler" id="fridayList">Friday</div>
68
<ul class="toggler-target">
69
<li>
70
<a class="btn btn-primary fw-light">Add Task</a>
71
<a class="btn btn-danger fw-light">DeleteTask</a>
72
</li>
73
</ul>
74
</li>
75
<li>
76
<div class="toggler">Saturday</div>
77
<ul class="toggler-target" id="saturdayList">
78
<li>
79
<a class="btn btn-primary fw-light">Add Task</a>
80
<a class="btn btn-danger fw-light">DeleteTask</a>
81
</li>
82
</ul>
83
</li>
84
<li>
85
<div class="toggler">Sunday</div>
86
<ul class="toggler-target" id="sundayList">
87
<li>
88
<a class="btn btn-primary fw-light">Add Task</a>
89
<a class="btn btn-danger fw-light">DeleteTask</a>
90
</li>
91
</ul>
92
</li>
93
</ul>
94
<script src="/js/script.js" defer charset="UTF-8"></script>
95
</div>
Advertisement
Answer
You need to delegate
this code replaces all other code than function addTask() {
JavaScript
1
9
1
document.getElmentById("todos").addEventListener("click",function(e) {
2
const tgt = e.target;
3
if (tgt.matches(".todo")) tgt.classList.toggle('active');
4
else if (tgt.matches(".toggler")) {
5
tgt.classList.toggle('active');
6
tgt.nextElementSibling.classList.toggle('active');
7
}
8
})
9