在javascript中使用元素集合数组中的元素

时间:2015-04-12 20:18:11

标签: javascript html

u和v的值正确地为1和0 ......但是语句“t[i].children[v].onclick=function(){}”中没有使用这些值。!! 当我在u的位置使用1而在v的位置使用0时,这非常有效! 这是代码:

    <div class="dropdown">
    <span class="menu-toggler">Menu</span>
    <ul class="dropdown-menu">
    <li>First Part</li>
    <li>Second Part</li>
    </ul>
</div>



<script type="text/javascript">

function init()
{
    t = document.getElementsByClassName("dropdown");
    for(i=0;i<t.length;i++)
    {
        v = getMenuToggler(t[i]); // v is becoming 0 correctly
        u = getDropDown(t[i]); // u is becoming 1 correctly
 // the next statement is not working properly!!!
        t[i].children[v].onclick=function(){if(this.parentNode.children[u].classList.contains("menu-

open")){this.parentNode.children[u].classList.remove("menu-open");}else{this.parentNode.children

[u].classList.add("menu-open");}}
    }
}

function getDropDown(x) // this function is all right... u can ignore this
{
    for(i=0;i<x.childElementCount;i++)
    {
        if(x.children[i].classList.contains("dropdown-menu"))
        return i;
    }
    return -1;
}

function getMenuToggler(y) //this function is all right... u can ignore this
{
    for(i=0;i<y.childElementCount;i++)
    {
        if(y.children[i].classList.contains("menu-toggler"))
        return i;
    }
    return -1;
}
</script>
<script>window.onload=init;</script>

提前谢谢你...... :)

3 个答案:

答案 0 :(得分:2)

window.onload=init();

如果你这样写,那么会立即调用init而不是被指定为事件监听器的函数。

你想要的是:

window.onload=init;

或者以更标准化和现代化的方式:

window.addEventListener('load',init);

如果您在原始代码中错误地过早调用init,则DOM尚未加载,因此您无法获取任何元素。

当您编写onclick时,将不会定义t[i]属性t[i].children[1]的指定函数。

由于该功能已分配给onclick的{​​{1}}属性,因此您可以将t[i].children[0]替换为t[i].children[1],这将是等效的。

答案 1 :(得分:0)

<div class="dropdown" onclick="add_class(this)">
    <span>Menu</span>
    <ul>
        <li>First Part</li>
        <li>Second Part</li>
    </ul>
</div>
    <script>

    function add_class(dropdown) {
      dropdown.getElementsByTagName("ul")[0].className = (dropdown.getElementsByTagName("ul")[0].className == "menu-open") ? "" : "menu-open";
   }
    </script> 

答案 2 :(得分:-1)

您的代码中有1个漏洞

  1. 你不是从任何地方调用这个函数,它只是 声明,所以我点击时从ul调用。
    • 所以没有必要调用此行t [i] .onclick,
    • 我的代码是将 menu-open 添加到元素ul。
  2. DEMO:http://jsfiddle.net/yosrknv3/1/

        <div class="dropdown">
            <span>Menu</span>
            <ul onclick="init_menu()">
                <li >First Part</li>
                <li>Second Part</li>
                </ul>
            </div>
    <script>
        function init_menu()
        {
                t=document.getElementsByClassName("dropdown");                                for(i=0;i<t.length;i++)
                {
                     console.log("i am clicked"+t[i],t[i].children[1]);
                     t[i].children[1].classList.add("menu-open");
                }
       }
    </script>