为啥我不能更改已定义元素的类名

Posted

技术标签:

【中文标题】为啥我不能更改已定义元素的类名【英文标题】:Why can't I change the className of a defined element为什么我不能更改已定义元素的类名 【发布时间】:2016-05-20 16:55:09 【问题描述】:

我只是想删除一类没有像 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 hidden = document.getElementsByClassName('hidden'); 将在第一个选定元素已更改并且元素的length 变小时后再次运行。

【问题讨论】:

【参考方案1】:

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

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

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

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

编辑

根据 cmets 的建议,您还可以反复修改 hidden[0]

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

【讨论】:

您是否也可以重复应用hidden[0].className = ''; 到第一个元素,直到没有元素? @JosephYoung - 是的,这也行。我在答案中添加了该方法的示例。谢谢。 感谢您的解释!但是当我只使用一次document.getElementsByClassName('hidden')并将值写入变量时,为什么会发生这种情况? @dede - 因为您只是将一个对活动 NodeList 的引用分配给一个变量。作业没有做任何特别的事情。

以上是关于为啥我不能更改已定义元素的类名的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能使用“List”作为 UITableViewController 子类的类名?

根据类名替换 HTML 元素?

如何更改特定类名的所有类名元素

为啥我无法使用 MSXML2 和 VBA 将 HTML 类名添加到元素集合

onClick事件更改类名反应js

为啥你不能命名一个在函数中创建的对象,与它在 Python 中的类名完全相同?