【发布时间】:2019-03-30 04:23:59
【问题描述】:
这是我的任务:
每次更新任务时(检查一下, 取消选中或添加)输出元素应更新为完成的数量 任务和任务数量。例如。如果您有 7 个任务并且完成了 3 个任务,则应为 '3/7 完成'。
在 Js 代码的第 3 部分,我创建了一个数组,其中包含由用户输入创建的 HTML 列表中的所有任务元素。在底部的第 5 部分,我创建了一个名为 taskAmount 的函数,我尝试使用一些 JavaScript 函数来查找待办事项列表中复选框的数量和元素的数量。然后我尝试返回这些值并将它们打印到控制台以检查它是否有效。最后,我想尝试创建一个类似于示例中所示的输出,但我认为一旦我首先获得我想要的值,我就可以自己做到这一点。
我没有收到错误,但我的功能似乎不起作用。我的猜测是我在 taskAmount 函数的前几行中犯了一个错误。
我的尝试:
tasks = [];
function addTask() {
var li = document.createElement("li");
// Adding checkbox
var cbox = document.createElement('INPUT');
cbox.setAttribute('type', 'checkbox');
li.appendChild(cbox);
cbox.setAttribute('id', 'box');
// Adding thing to do
var inputValue = document.getElementById("newTask").value;
var task = document.createTextNode(inputValue);
li.appendChild(task);
if (inputValue === '') {
alert("You must write something!");
} else {
var ullist = document.getElementById("list");
ullist.insertBefore(li, ullist.childNodes[0]);
}
// Part 3
tasks.push(newTask.value);
document.getElementById("newTask").value = '';
}
// Prevent Default
document.getElementById("submit").addEventListener("click", function() {
event.preventDefault()
});
// Part 4
function ifChecked() {
var list1 = document.querySelector('ul');
list1.addEventListener('click', function(ev) {
if (ev.target.tagName === 'INPUT') {
ev.target.parentElement.classList.toggle('checked');
}
}, false);
}
ifChecked();
// Part 5
function taskAmount() {
var totalTasks;
var checkedTasks;
document.getElementById("submit").addEventListener('click', function() {
var totalTasks = tasks.length;
var checkedTasks = document.querySelectorAll('input[type="checkbox"]:checked').length;
return (totalTasks);
return (checkedTasks);
})
console.log(totalTasks);
console.log(checkedTasks);
}
taskAmount();
body {
width: 600px;
margin: auto;
background: #ffe699;
font-family: garamond;
font-size: 25px;
}
ul {
list-style-type: none;
padding: 0;
border: 2px solid black;
}
ul li {
padding-top: 15px;
padding-bottom: 15px;
font-weight: bold;
transition: 0.3s;
}
fieldset {
background: skyblue;
border: 2px solid black;
}
ul li:nth-child(odd) {
background-color: skyblue;
}
ul li:nth-child(even) {
background-color: white;
}
ul li:hover {
background-color: #55D;
}
#box {
margin: 0px 20px 0px;
}
.checked {
text-decoration: line-through;
}
HTML
<!DOCTYPE html>
<html lang="en" dir="ltr">
<head>
<meta charset="utf-8">
<title> To do list </title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<h1> To do list </h1>
<form class="" action="todo.html" method="post">
<fieldset>
<label> Add a task in the input field below </label> <br><br>
<input id="newTask" type="text" placeholder="Type a task here" autofocus> <br><br>
<input id="submit" onclick="addTask()" type="submit" value="Add task"><br><br>
<output name="result"> </output>
</fieldset>
</form>
<h2>List of things to do</h2>
<ul id="list">
</ul>
<script src="todo.js">
</script>
</body>
</html>
【问题讨论】:
-
在同一个函数中有两个返回值。执行将在第一个
return (totalTasks)之后停止,并且永远不会到达第二个返回。 -
我想统计检查的任务数。您写的内容不会返回真值或假值吗?不确定我是否正确理解了您的问题。
-
是的,我认为这可能是原因。我想我从 Python 中回忆起,在同一个函数中不能有两个以上的返回值,但你仍然可以返回多个值,对吧?像这样:return(totalTasks, checkedTasks)?
-
您遇到的一个问题是您的函数
addTask()创建了一个id 为box的元素。如果您运行该函数两次或更多次,则您复制了 html 中不允许的 id。 -
@HankMoody 不,id 不是您的问题的原因,但可能是未来问题的原因。这就是为什么我评论它而不是发布答案。将其更改为类是解决它的有效方法。
标签: javascript html css