我有以下代码将onmouseover
事件添加到项目符号onload
for (var i = 0; i <= 3; i++) {
document.getElementById('menu').getElementsByTagName('li')[i].onmouseover = function () { addBarOnHover(i); };
}
这是它正在调用的函数。当鼠标移过它时,它应该在菜单项中添加一个css类。
function addBarOnHover(node) {
document.getElementById('menu').getElementsByTagName('li')[node].className = "current_page_item"; }
调用该函数时,我不断收到错误:
“document.getElementById(”menu“)。getElementsByTagName(”li“)[node] is 未定义“
让我感到困惑的是我向addBarOnHover
函数添加了一个alert(node)语句,以查看参数的值是什么。警报说传递的参数的值是4.我不确定如何在我设置的循环中发生这种情况。
非常感谢任何帮助。
答案 0 :(得分:4)
当您关闭迭代变量时,这是一个常见问题。用额外的方法包装for
主体以捕获迭代变量的值:
for (var i = 0; i <= 3; i++) {
(function(i){ //here
document.getElementById('menu').getElementsByTagName('li')[i].onmouseover = function () { addBarOnHover(i); };
})(i); //here
}
每次输入循环时都会创建一个匿名函数,并传递迭代变量的当前值。匿名函数内的i
引用此函数的参数,而不是外部范围中的i
。
为清晰起见,您还可以重命名内部变量:
for(var i=0; i<=3; i++){
(function(ii){
//use ii as i
})(i)
}
在没有捕获迭代变量的情况下,最终在匿名处理程序中使用的i
的值已经更改为4
。外部作用域中只有一个i
,在处理程序的所有实例之间共享。如果通过匿名函数捕获值,则使用该函数的参数。
答案 1 :(得分:1)
i
作为参考传递(而不是按值传递),因此调用onmouseover
回调后,i
的值已变为4
。< / p>
您必须使用其他功能创建回调函数:
var menu = document.getElementById('menu');
var items = menu.getElementsByTagName('li');
for (var i = 0; i <= 3; i++) {
items[i].onmouseover = (function(i) {
return function() {
addBarOnHover(i);
};
})(i);
}
通过制作辅助函数,你可以使它更具可读性:
var createCallback = function(i) {
return function() {
addBarOnHover(i);
};
};
for (var i = 0; i <= 3; i++) {
items[i].onmouseover = createCallback(i);
}