无法读取未定义的属性“addEventListener”

时间:2015-12-28 09:22:49

标签: javascript

  function asign(id){

 return document.getElementById(id) ;
} 
var b = ['p','q','r','s','t','u','v'];
var a = ['fname','lname','email','password','r_password','g_m',"g_f"] ; 

 for (i=0;i<a.length;i++) {
        var x = {} ;
     x[b[i]] = asign(a[i]) ;
      x[i].addEventListener('click', function() { alert(x[i].value) ;} ,false) ;

 }  

我只想在for循环中将变量和ID数组与它们对齐。

2 个答案:

答案 0 :(得分:3)

您希望x[i]返回刚刚存储的DOM元素,但您要在x[b[i]]而不是x[i]存储DOM元素。保持一致,这个错误就会消失。

但是,代码仍然无法正常工作,因为您正在进入闭包陷阱:当发生单击时,事件处理程序将使用i ,因为它< / em>,而不是创建处理程序时的情况。因此,所有处理程序都会将i视为a.length并失败。

我通常使用构建器函数来处理:

for (i = 0; i < a.length; i++) {
    var x = {};
    x[b[i]] = asign(a[i]);
    hookUp(i);
}
function hookUp(index) {
    x[b[index]].addEventListener('click', function() {
        alert(x[b[index]].value);
    }, false);
}

hookUp使用index(我们不会改变)而不是i。 (我还猜测了要使用哪个,x[i]x[b[i]]。)

也就是说,如果您的目标是提醒value已点击的元素,请改为使用this

for (i = 0; i < a.length; i++) {
    var x = {};
    x[b[i]] = asign(a[i]);
    x[b[i]].addEventListener('click', function() {
        alert(this.value);
    }, false);
}

Event#currentTarget

for (i = 0; i < a.length; i++) {
    var x = {};
    x[b[i]] = asign(a[i]);
    x[b[i]].addEventListener('click', function(e) {
        alert(e.currentTarget.value);
    }, false);
}

答案 1 :(得分:0)

&#13;
&#13;
    function asign(id){

     return document.getElementById(id) ;
    } 
    var a = ['a','b','c'];
    var b = ['fname','lname','email'] ; 

     for (i=0;i<a.length;i++) {
       (function(i){
         var x = {} ;
         x[b[i]] = asign(a[i]) ;
         x[b[i]].addEventListener('click', function() { alert(i+1) ;} ,false) ;
         })(i);

     }  
&#13;
<div id="a">Div 1</div>
<div id="b">Div 2</div>
<div id="c">Div 3</div>
&#13;
&#13;
&#13;