开发者问题收集

未捕获的类型错误:无法读取未定义的属性(读取“包含”)[重复]

2022-04-14
5058

作为 DevEd 在线教程的一部分,我正在尝试创建一个简单的待办事项列表应用程序,但是我遇到了一个看似令人费解的错误。

使用以下 HTML 标记:

<div class="todo-container">
  <ul class="todo-list"></ul>
</div>

.. 以及一些 javascript 来创建和插入一些列表元素,然后我使用以下函数按具有特定类标记的待办事项列表条目进行筛选。

function filterTodo(e) {
  const todos = todoList.childNodes;
  todos.forEach(function (todo) {
    switch (e.target.value) {
      case "all":
        todo.style.display = "flex";
        break;
      case "completed":
        if (todo.classList.contains("completed")) {
          todo.style.display = "flex";
        } else {
          todo.style.display = "none";
        }
        break;
    }
  });
}

以上所有内容似乎都可以很好地协同工作,直到我添加了任何内容,甚至是 <ul></ul> 标记之间的注释行,如下所示:

<div class="todo-container">
      <ul class="todo-list">
         <!-- boo -->
      </ul>
</div>

执行此操作后,我在尝试过滤条目时收到以下错误:

Uncaught TypeError: Cannot read properties of undefined (reading 'contains')

有人可以解释一下吗?

找到完整代码这里: https://github.com/developedbyed/vanilla-todo (不是我的仓库)

2个回答

childNodes 返回一个子 节点 集合(听起来是这样的)。其中一些节点可能不是元素,而是文本节点,而文本节点没有 classList 属性。例如:

const childNodes = document.querySelector('.container').childNodes;
console.log(childNodes[0].classList);
console.log(childNodes[1].classList);
<div class="container">text node<span>element</span></div>

请改用 .children ,它将仅检索子 元素

function filterTodo(e) {
  [...todoList.children].forEach(function (todo) {
CertainPerformance
2022-04-14

使用 .children 代替 .childNodes。这样错误信息就会消失

aylee
2023-04-11