Javascript 为什么这是未定义的?
我试图在元素悬停时修改它,在某个时候,我需要获取所有类名为“image”的元素,我的问题是,虽然Allegements在主函数中有一个值(第一个警报显示该值),但从匿名函数调用Allegements时,它不再有值(未定义) 这里怎么了Javascript 为什么这是未定义的?,javascript,Javascript,我试图在元素悬停时修改它,在某个时候,我需要获取所有类名为“image”的元素,我的问题是,虽然Allegements在主函数中有一个值(第一个警报显示该值),但从匿名函数调用Allegements时,它不再有值(未定义) 这里怎么了 function register() { var i = 0 var allElements = document.getElementsByClassName("image") alert(allElements) // Has a
function register() {
var i = 0
var allElements = document.getElementsByClassName("image")
alert(allElements) // Has a value
while (i < allElements.length) {
allElements[i].addEventListener("mouseover", function() {
var description = null
var j = 0
alert(allElements[i]) // Undefined
while (j < allElements[i].children.length) {
var child = allElements[i].children[j]
description = child
if (child.id == "description") {
break
}
j++;
}
description.style = "display: block"
});
i++
}
}
函数寄存器(){
变量i=0
var allegements=document.getElementsByClassName(“图像”)
警报(等位基因)//有一个值
而(i<等位基因长度){
等位基因[i]。addEventListener(“mouseover”,function()){
var description=null
var j=0
警报(等位基因[i])//未定义
while(j<等位基因[i].儿童.长度){
var child=等位基因[i]。children[j]
description=child
if(child.id==“description”){
打破
}
j++;
}
description.style=“显示:块”
});
我++
}
}
谢谢在事件触发时,
i
等于元素。长度
,因此元素[i]
未定义-没有元素[elements.length]
这样的元素
您会想在这里阅读:它更详细地解释了循环索引变量问题
对于您的特定问题,人们建议通过注释使用
this
,因为在事件处理程序中,this
对象指的是被鼠标移过的元素,这允许您完全避免循环索引问题。尝试在函数中传递事件,并通过事件访问元素
allElements[i].addEventListener("mouseover", function(e) {
// code
alert(e.target);
// code
});
在事件侦听器的函数中,您引用的是
allegements[i]
,它不再是有效的引用。将其替换为this
尝试将其引用为alert(this)
而不是事件外部的变量listener@ChrisForrence你是说this.allegements[i]
?要进一步说明为什么它是未定义的,当while
循环结束时,i
的值为allegements.length
(因为它在循环的每个刻度上增加1,甚至在我们退出之前)。如果等位基因中有7个元素,那么i
将是7,而等位基因[7]
不存在。这只是为了您的概念理解,请按照上面的建议进行实际修复。@Amleonard但是这是指什么?