只有最后一个菜单正常工作

时间:2015-04-12 22:01:27

标签: 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>
    <li>First Part</li>
    <li>Second Part</li>
    </ul>
</div>

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

    <script type="text/javascript">

   function init()
   {
    t = document.getElementsByClassName("dropdown");
    for(var i=0;i<t.length;i++)
    {
        v = parseInt(getMenuToggler(t[i]));
        u = parseInt(getDropDown(t[i]));

    (function (v, u){

    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");
      }
    };

   })(getMenuToggler(t[i]), getDropDown(t[i]));
    }
    }

    function getDropDown(x)//this function is perfectly ok
    {
    for(j=0;j<x.childElementCount;j++)
    {
        if(x.children[j].classList.contains("dropdown-menu"))
        return j;
    }
    return -1;
    }

   function getMenuToggler(y) // this function is perfectly ok
   {
    for(k=0;k<y.childElementCount;k++)
    {
        if(y.children[k].classList.contains("menu-toggler"))
        return k;
    }
    return -1;
    }
     </script>
    <script>window.onload=init;</script>

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

1 个答案:

答案 0 :(得分:0)

当您在循环中绑定的事件处理程序中使用变量时,循环中的每次迭代都需要一组变量。否则,所有事件处理程序将使用相同的变量,并获取循环中最后一项的值。

使用函数包装器为每次迭代创建一组变量:

for (var i = 0; i < t.length; i++) {

  (function (v, u){

    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");
      }
    };

  })(getMenuToggler(t[i]), getDropDown(t[i]));

}