Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/456.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 变量在for循环中变为未定义_Javascript_Scope_Undefined_Var - Fatal编程技术网

Javascript 变量在for循环中变为未定义

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

我正在与一个javascript函数搏斗

在for循环中,我使用类“visible”迭代该循环中的所有元素 我在表演两个动作

  • 元素[i].removeAttribute(“类”)
  • 元素[i].setAttribute(“类”、“隐藏”) 由于某些原因,只有1是有效的。2生成一个错误,表示:

    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”);
    ,因为您使用class
    getElementsByClassName(“可见”);
    选择了元素。我认为当您从元素中完全删除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");
    }