所以基本上我正在制作待办事项清单来练习使用纯Javascript。我不想使用Jquery。最终我想使用Jquery重新创建它。
我目前的问题是,当我在第43行(jsfiddle)上运行for循环时,它只删除所有其他复选框,当我想要打开和关闭所有这些复选框时。对不起,如果我的代码容易理解。这是我第一次尝试创造这么复杂的东西。
Websocket session
要查看我的问题,请添加一些项目,保存每项,然后点击几次编辑。
http://jsfiddle.net/whsn1bom/31/
请留下任何建议/意见! 谢谢!
答案 0 :(得分:4)
因为当您移除该项目时,其他项目会向下移动一项。这是一个现场收藏。向后循环或使用while循环。
for (var x = findSpanBoxes.length-1 x>=0; x--) {
或
var boxes = document.getElementsByClassName("box");
while (boxes.length) {
var box = boxes[0];
box.parentNode.removeChild(box);
}
答案 1 :(得分:1)
你在这一行有一个逻辑缺陷
for (x = 0; x < findSpanBoxes.length; x++) {
将迭代更改为以下内容,它将起作用
for (x = findSpanBoxes.length-1; x >=0; x--) {
这是因为从列表中删除子项目项时,每个元素的索引减1。通过从列表末尾删除项目(即在最高索引处),剩余项目的内容不会改变。
例如,假设您有项目(index 0 = A, index 1 = B; index 3 = C; index 4 = D).
(index 0 = B, index 1 = C; index 2 = D)
。删除第一个元素导致其余项目的内容发生变化。答案 2 :(得分:1)
您是否检查过控制台是否有错误?
Uncaught TypeError: Cannot read property 'parentNode' of undefined
问题是你在循环中调用了document.getElementsByClassName("box")
。为什么这是一个问题?好吧,你也要删除循环内的项目。每次删除项目时,document.getElementsByClassName("box")
数组都会变短,因为它只返回执行时存在的项目(并且您在调用之间删除项目)。
为了帮助解释这一点,请以这种方式思考。第一次通过循环,删除.box
的第一个索引。然后,在下一次迭代中,您正在创建一个新数组,并且您正在删除第二个索引。因此,你刚跳过一个盒子。
因此,要解决这个问题,您可以随时删除数组的第一个索引。
var box = document.getElementsByClassName("box")[0];
或者,您可以获取父对象,并以此方式删除.box
元素。
var box_parent = document.getElementsByClassName("spanBox")[x];
box_parent.removeChild(box_parent.firstChild);
答案 3 :(得分:1)
当epascarello的答案暗示时,getElementsByClassName
会返回HTMLCollection这是一个真人集合;对DOM的更改会自动立即反映在其中。
正如他的回答所说,向后迭代数组避免了从DOM中删除项目的副作用。另一个解决方案是convert the array-like HTMLCollection into an array:
var boxes = [].slice.call(document.getElementsByClassName("box"));
这会使boxes
成为一个真正的数组而不是一个类似实时数组的对象。对DOM的更新不会改变数组的长度,因此您仍然可以向前遍历数组。
如果您使用的是转发器或仅针对支持ES6的浏览器,则可以使用扩展运算符将阵列转换缩短为:
var boxes = [...document.getElementsByClassName("box")];