javascript - 无法读取未定义的属性 'addEventListener'

标签 javascript

  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 数组。

最佳答案

您期望 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]]。)

也就是说,如果您的目标是提醒被单击元素的,请改用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);
}

关于javascript - 无法读取未定义的属性 'addEventListener',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34490799/

相关文章:

javascript - jquery访问没有类名的表单

javascript - 选项卡无法正常工作

javascript - 如何在 IE9 中启用 javascript window.focus()

javascript - 当连续单词长度为 50 个字符时插入空格

Javascript 无法在带有温泉的 Cordova 工作

javascript - 响应甜蜜警报 2 后触发功能

javascript - 在 javascript 函数内以 Eloquent ORM 传递参数

javascript - 聚合物应用程序抽屉在关闭时留下悬挂的 wrapper ,内容不会占用所有空间

javascript - 如何构建基于 Backbone.View 的插件,以便可以单独扩展其嵌套 View ?

JavaScript 仅能在浏览器之间平滑滚动