Javascript 无法将复选框属性应用于for循环
好吧,我希望我错过了一些简单的事情。基本上,我正在制作一个待办事项列表,我希望每个列表项都显示一个复选框。当用户单击该复选框时,textDecoration=line-through应该遍历listItem类。这意味着一行代码贯穿了人员创建的待办事项任务。以下是我主要使用的代码:Javascript 无法将复选框属性应用于for循环,javascript,for-loop,if-statement,Javascript,For Loop,If Statement,好吧,我希望我错过了一些简单的事情。基本上,我正在制作一个待办事项列表,我希望每个列表项都显示一个复选框。当用户单击该复选框时,textDecoration=line-through应该遍历listItem类。这意味着一行代码贯穿了人员创建的待办事项任务。以下是我主要使用的代码: function show() { var todos = get_todos(); var html = '<ul>'; for(var i=0; i < todos.length; i++) {
function show() {
var todos = get_todos();
var html = '<ul>';
for(var i=0; i < todos.length; i++) {
html += '<span><li class="listItem" style="float:left;">' + todos[i] + '</li><input class="checkBox" type="checkbox">' + '<button class="remove" id="' + i + '"><i class="fa fa-trash" aria-hidden="true"></i></button></span><br/>';
};
html += '</ul>';
document.getElementById('todos').innerHTML = html;
var buttons = document.getElementsByClassName('remove');
for (var i=0; i < buttons.length; i++) {
buttons[i].addEventListener('click', remove);
};
////////////////////////////////////
//Everything above here works. Below is the checkbox issue
var checkBox = document.getElementsByClassName("checkBox");
var listItem = document.getElementsByClassName("listItem");
for (var i=0; i < checkBox.length; i++) {
if (checkBox.checked == true){
listItem.style.textDecoration = "line-through";
}else {
listItem.style.textDecoration = "none";
}
};}
我现在的情况是,如果我在原始复选框中创建一个onClick函数,我就可以使用if/else语句,它可以正常工作。如果我使用document.getElementsByClassName设置checkBox/listItems变量,它将不起作用,但是如果我使用document.getElementById,它将起作用。问题是,它只在用户创建的第一个任务上工作,而在用户创建之后,其他任务都不工作。我假设这是因为ID只对一个元素起作用,而不像类对多个元素起作用,或者是因为它不像上面的代码那样在for循环中循环
TL/DR基本上当我运行上面的代码时,我一直得到未捕获的TypeError:无法设置未定义的属性“textDecoration”
在今天的节目中。js:57
在todo.js:75
当我为复选框创建一个单独的函数并使用elementbyid而不是elementsbyclass来更改上面html部分的id/类时,我不会出现这个错误
我真的很想让这些效果在所有任务中都能发挥作用,而不仅仅是第一个任务。非常感谢您的任何想法。谢谢大家
功能表演{
var todos=获取todos;
var html=;
对于变量i=0;ivar checkBox = document.getElementsByClassName("checkBox");
var listItem = document.getElementsByClassName("listItem");
for (var i=0; i < checkBox.length; i++) {
if (checkBox.checked == true){
listItem.style.textDecoration = "line-through";
}else {
listItem.style.textDecoration = "none";
}
};}
为了清楚起见,我在需要的地方对名称进行了多元化,并添加了索引引用:
var checkBoxes = document.getElementsByClassName("checkBox");
var listItems = document.getElementsByClassName("listItem");
for (var i=0; i < checkBoxes.length; i++) {
if (checkBoxes[i].checked == true){
listItems[i].style.textDecoration = "line-through";
}else {
listItems[i].style.textDecoration = "none";
}
};}
如果可能的话,我会用css而不是javascript来实现这一点,这通常是我的规则。在这种情况下,您必须对标记进行一个小的更改:因为没有以前的同级选择器,所以您必须将输入放在相应的lis之前,但是因为lis是浮动的:left,所以它仍然呈现完全相同的结果 输入:选中+li{ 文字装饰:线条贯通; } 福 酒吧 巴兹
您必须使用复选框[i]并找到合适的列表项[i]来设置textDecoration,目前您正在检查整个列表checkBoxlistItem是元素的集合,样式不是元素集合的属性,因此样式未定义,这就是为什么您不能在其上设置textDecoration。您必须迭代每个listItem元素才能以这种方式设置属性。当我沿着var checkBoxes=document.getElementsByClassNamecheckBox的行尝试一些东西时,这同样适用于checkBox这是一个集合;var listItems=document.getElementsByClassNamelistItem;对于var i=0;i