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>
提前谢谢你...... :)
答案 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]));
}