我希望我的代码通过添加slactive
类来显示菜单,并更改ddown
集合中输入的值。我有一些代码,这不起作为控制台说在第9行也没有ddown[i]
,也没有slitems[j]
是对象,因为它们是未定义的。如何解决这个问题?
var slitems = document.getElementsByClassName('slitem');
ddown = document.getElementsByClassName('ddown');
for(i=0; i<ddown.length; i++) {
ddown[i].addEventListener('click', function(){document.getElementById('sl'+i).classList.add('slactive');valueChange()});
}
function valueChange(){
for(j=0;j<slitems.length;j++){
slitems[j].addEventListener('click', function(){
ddown[i].value = slitems[j].value;
document.getElementById('sl'+i).classList.remove('slactive');
});
}
}
P.S。 slitems
是菜单元素的集合。
答案 0 :(得分:2)
看,你在做什么至少有两个缺陷:
第1步:执行此操作时:for(i = 0; i&lt; ddown.length; i ++)...您声明一个名为i的全局变量,在循环结束时将具有值ddown.length;所以,在valueChange中,它总是具有相同的值第二:我被设置为ddown.length,这是一个在数组中不存在的位置,因此你得到了错误。
要解决此问题,请使用var将i设置为局部变量,并将其作为参数传递:
var slitems = document.getElementsByClassName('slitem');
ddown = document.getElementsByClassName('ddown');
for(var i=0; i<ddown.length; i++) {
ddown[i].setAttribute("data-index", i);
ddown[i].addEventListener('click', function(e){
var i = e.target.dataset.index;
document.getElementById('sl'+i).classList.add('slactive');valueChange(i)
});
}
function valueChange(i){
for(var j=0;j<slitems.length;j++){
slitems[j].setAttribute("data-index", j);
slitems[j].setAttribute("data-index2", i);
slitems[j].addEventListener('click', function(e){
var j = e.target.dataset.index;
var i = e.target.dataset.index2;
ddown[i].value = slitems[j].value;
document.getElementById('sl'+i).classList.remove('slactive');
});
}
}
修改强>
更改代码以将迭代器中使用的变量添加为节点属性,应该修复变量范围问题。