javascript - 为什么我不能更改已定义元素的 className

标签 javascript arrays undefined classname

我只是想删除一些元素的一类,而不需要任何像 jQuery 这样的框架。 首先我尝试使用 for(... in ...) 而不是将 ist 更改为 for(var i...) 但现在我发现甚至直接选择都不起作用。

使用 jQuery 可以正常工作。但它...让我们来解释一下 jQuery 的作用。

我的脚本:

[109] <script>
[110]   var hidden = document.getElementsByClassName('hidden');
[111]   console.log('Class "hidden" size: ' + hidden.length);
[112]   console.log(hidden[0].tagName);
[113]   console.log(hidden[1].tagName);
[114]
[115]   hidden[0].className = '';
[116]   hidden[1].className = '';
[117] </script>  

控制台日志:

Class "hidden" size: 2
H1
FORM
Uncaught TypeError: Cannot set property 'className' of undefined(anonymous function) @ login.html:116

为什么我可以获取hidden[1]的tagName,但不能更改其className,而是针对hidden[0]

当我将顺序更改为

[115]   hidden[1].className = '';
[116]   hidden[0].className = '';

所以 hidden[1] 是在 hidden[0] 之前工作的。

看起来 var hide = document.getElementsByClassName('hidden'); 当第一个选定元素已更改且 length 时将第二次运行元素变小。

最佳答案

getElementsByClassName 返回一个live NodeList,这意味着它包含的元素会随着 DOM 的变化而变化。您从该集合中的元素中删除相关的类名称,该元素将自动从集合中删除。

因此,您应该向后迭代元素:

for ( var i = hidden.length - 1; i > -1; i-- ) {
  hidden[ i ].className = '';
}

在第一次迭代中,集合将包含 2 个元素(索引为 0 和 1)。您从索引 1 处的元素中删除该类,并且该元素也会从集合中删除。在下一次迭代中,集合中只剩下一个元素,但由于 i 已递减至 0,因此您可以正确引用它。

编辑

根据评论中的建议,您还可以重复修改hidden[0]:

while ( hidden.length ) {
  hidden[ 0 ].className = '';
}

关于javascript - 为什么我不能更改已定义元素的 className,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35313510/

相关文章:

javascript - 函数是否总是返回值

javascript - Typescript - TypeError myclass.myFunction 不是函数

php - 数组返回 [Object object] 而不是值?

重新实现 Array.prototype.slice 的 JavaScript 难题未按预期工作

javascript - 是否有类似 "Firebug for IE"的东西(用于调试 JavaScript)?

javascript - 服务无法正常工作时可观察到的主题

c - 在C中的字符串char数组中搜索字符串

在 C 中复制不确定的指针

javascript - 在 Angular 8 中将数字转换为度数

javascript - 为什么这段代码运行错误