Javascript 只有最后一个菜单在工作

Javascript 只有最后一个菜单在工作,javascript,html,Javascript,Html,u和v的值正确地表示为1和0。。。但是这些值没有在语句“t[i].children[v].onclick=function(){}”中使用。。!!当我用1代替u,用0代替v时,这个效果非常好!!!代码如下: <div class="dropdown"> <span class="menu-toggler">Menu</span> <ul> <li>First Part</li> <

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

    <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>

菜单
  • 第一部分
  • 第二部分
菜单
  • 第一部分
  • 第二部分
函数init() { t=document.getElementsByClassName(“下拉菜单”);
对于(var i=0;i当您使用绑定在循环中的事件处理程序中的变量时,您需要为循环中的每个迭代使用一组变量。否则,所有事件处理程序将使用相同的变量,并获取循环中最后一项的值

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

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]));

}
for(变量i=0;i
既然数字切换有效,你有没有尝试过
v=parseInt(getMenuToggler(t[i]);
我尝试过了,并且成功了…谢谢@Craicerjack..但是现在如果我添加更多的下拉元素,它就不起作用了!!!只有最后一个下拉列表是“菜单打开”类!!!也尝试过了..谢谢:)@Guffa但问题仍然是一样的!!!1个“下拉列表”根本不起作用…但是如果我使用2个“下拉列表”,只有最后一个“下拉列表”起作用…如果我添加3个“下拉列表”页面没有加载!!!!@SamarpanDas:这是因为您到处都在使用全局变量。
getMenuToggler
getDropDown
中的循环覆盖了
i
中的值,因此
t[i]
不起作用。在函数中本地声明变量:
i
(var i=..
.Demo:@SamarpanDas:当项目之间的
u
v
不同时(这是动态获取索引的关键):谢谢@Guffa…:)但请查看我编辑的帖子……它也有效,但当我有超过1个“下拉列表”时菜单只有最后一个菜单有效!!!我使用了你的代码并在本地声明了变量I、j和k…)那么,为什么会发生这种情况?我该如何解决呢?@SamarpanDas:请不要更改问题中的原始代码,那么看起来所有答案都是在暗示代码中已经存在的东西……请添加新版本的代码。以不同的方式命名变量并不会使它们成为局部变量,但应该可以避免直接的问题em(由于全局变量冲突,您以后只会遇到其他问题)。请看我在推荐中链接的示例,其中有三个菜单可以很好地工作。