未定义不是Dropdown中的对象

时间:2016-11-02 20:02:22

标签: javascript

我希望我的代码通过添加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是菜单元素的集合。

1 个答案:

答案 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');
        });
    }
}

修改

更改代码以将迭代器中使用的变量添加为节点属性,应该修复变量范围问题。