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数组与它们对齐。
答案 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)
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;