Javascript 变量在for循环中变为未定义
我正在与一个javascript函数搏斗 在for循环中,我使用类“visible”迭代该循环中的所有元素 我在表演两个动作Javascript 变量在for循环中变为未定义,javascript,scope,undefined,var,Javascript,Scope,Undefined,Var,我正在与一个javascript函数搏斗 在for循环中,我使用类“visible”迭代该循环中的所有元素 我在表演两个动作 元素[i].removeAttribute(“类”) 元素[i].setAttribute(“类”、“隐藏”) 由于某些原因,只有1是有效的。2生成一个错误,表示: Uncaught TypeError: Cannot call method 'setAttribute' of undefined 即使我使用console.log记录元素[I];在第一次调用consol
Uncaught TypeError: Cannot call method 'setAttribute' of undefined
即使我使用console.log记录元素[I];在第一次调用console.log之后
元素存在,但在第二个控制台上。log元素[i]为“未定义”
我到底错过了什么?如果我的笔记本电脑没那么贵的话,这简直让我发疯了
现在它应该已经坏了。帮助:(
下面是函数:
function hide_visable_elements()
{
// remove body EventListener
var body = document.getElementsByTagName("body");
body[0].removeEventListener("click", hide_visable_elements, true);
var elements = document.getElementsByClassName("visible");
for (var i = 0; i < elements.length; i++)
{
console.log(elements[i]); // Works like a swiss clock
elements[i].removeAttribute("class");
console.log(elements[i]); // why elements[i] is 'undefined' now ???
elements[i].setAttribute("class", "hidden"); // << turns to useless code
}
}
函数隐藏可视元素()
{
//删除主体事件侦听器
var body=document.getElementsByTagName(“body”);
正文[0]。removeEventListener(“单击”,隐藏可查看的元素,true);
var elements=document.getElementsByClassName(“可见”);
对于(var i=0;i 元素[i].setAttribute(“类”、“隐藏”);//这是因为getElementsByClassName
返回一个NodeList
,它是活动的。也就是说,当它引用的元素更改时,它会自动更新
当您从节点列表
中的元素中删除类
属性时,它将从该列表中删除(因为它不再具有可见的
类名)
实际上,您不需要删除该属性。只需设置它也可以完成此工作。但是,由于节点列表在您操作它包含的元素时正在更改,因此您需要对其进行反向计数(每次更改其中一个元素时,它都会被删除,因此长度会减少一个):
我认为问题在于elements[I]。删除属性(“class”);
,因为您使用classgetElementsByClassName(“可见”);
选择了元素。我认为当您从元素中完全删除class属性时,会出现问题
请尝试对代码进行一些调整。如果您计划使用使用使用class attribute选择的相同元素,则不应删除属性类。getElementsByClassName
是一个活动的节点列表
,因此更改项目的className
会立即影响整个列表。我建议最终用途欧洲工商管理学院
Plus而不是var body=document.getElementsByTagName(“body”)
使用document.body
只是一个猜测。当您删除“class”时,元素会从数组中退出,因为它不再符合条件。您是否考虑过使用jQuery?这会使事情变得更简单。如果您从元素中删除了类
,那么您也将它从不符合条件的元素集中删除hat类。基本上,您删除了该元素。如果您使用Jquery的.removeClass()更简单。@captain在使用框架之前,我需要对javascript有很好的理解:)为了实现css转换,这两个动作是必须的。如果你是这个意思的话。你能再次提供querySelectorAll的示例吗?我正在学习。谢谢。顺便问一下,我为什么要使用document.body?性能?编辑:使用document.body找不到任何body标记。document.body
是一个方便的快捷方式。为什么选择它是否已提供对它的引用?
for (var i = elements.length - 1; i >= 0; i--) {
elements[i].setAttribute("class", "hidden");
}