Javascript 只有最后一个菜单在工作
u和v的值正确地表示为1和0。。。但是这些值没有在语句“t[i].children[v].onclick=function(){}”中使用。。!!当我用1代替u,用0代替v时,这个效果非常好!!!代码如下: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> <
<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(由于全局变量冲突,您以后只会遇到其他问题)。请看我在推荐中链接的示例,其中有三个菜单可以很好地工作。