开发者问题收集

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

2015-12-28
1367
  function assign(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]] = assign(a[i]) ;
      x[i].addEventListener('click', function() { alert(x[i].value) ;} ,false) ;

 }  

我只想要在 for 循环中为它们分配变量数组和 ID。

2个回答

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

但是,代码仍然无法工作,因为您陷入了闭包陷阱:当发生点击时,事件处理程序将使用 i 按当时 的原样,而不是创建处理程序时的样子。因此,所有处理程序都将看到 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);
}
T.J. Crowder
2015-12-28
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);

     }  
<div id="a">Div 1</div>
<div id="b">Div 2</div>
<div id="c">Div 3</div>
Divesh Oswal
2015-12-28