0

尝试删除表单中所有选中的复选框时,我不断收到错误消息。

"Uncaught TypeError: Cannot read property 'checked' of undefined" 

当运行这个

// remove only the 'checked' tasks
function remChecked() {
var nList = document.forms["theForm"].getElementsByTagName("input");
    for (var i = 0, l = nList.length; i < l; i = i + 1) {
        var list = nList[i];
        if (list.checked == true) {
            list.parentNode.removeChild(list);
        }
    }
}

var el3 = document.getElementById("removeChecked");
el3.addEventListener("click", remChecked, false);

错误是指上面带有“if”的行。

当只有一个带有checked=true属性的复选框输入时,它可以正常工作。

任何帮助,将不胜感激!

4

1 回答 1

1

活动的NodeList 中删除元素时,您需要以相反的顺序删除它们。

function remChecked() {
  //nList is a live NodeList
  var nList = document.forms["theForm"].getElementsByTagName("input");
  //loop backwards...
  for(var i=nList.length-1;i>-1;i--){
    var list = nList[i];
    if(list.checked == true){
        list.parentNode.removeChild(list);
    }
  }
}
var el3 = document.getElementById("removeChecked");
    el3.addEventListener("click", remChecked, false);

如果最初有 12 个复选框......并且一半 (6) 被选中。当您从 0 循环到“长度”时,如果您删除一个项目,则长度会缩小......因此,当您到达 11 (n-1) 时,没有匹配的元素。

通过反向工作...(11 到 0)如果您删除 11 这不是问题,因为下一次迭代是 10...然后是 9,然后是 8,...

于 2013-09-03T04:05:33.843 回答