我在所有处理程序上收到一条未定义的消息。我想将处理程序绑定到每个元素,并希望输出值。这段代码有什么问题?谢谢!
for (var i = 0; i < document.forms[0].elements.length; i++ ){
document.forms[0].elements[i].onfocus = test(this);
}
function test(ele){
alert(ele.value);
}
答案 0 :(得分:1)
您需要指定一个功能。目前,您指定test(window)
的返回值为undefined
。
onfocus = test;
然后引用函数内的元素:
function test(){
alert(this.value);
}
答案 1 :(得分:0)
您需要更改赋值和函数,因为元素将不再作为参数传入,如下所示:
for (var i = 0; i < document.forms[0].elements.length; i++ ){
document.forms[0].elements[i].onfocus = test;
}
function test(){
alert(this.value);
}
作为事件处理程序,this
中的test
将引用您正在处理的元素,因此只需从中获取值。
您当前方法的替代版本将是相同的test
方法,但使用匿名函数包装器将元素本身作为参数传递:
for (var i = 0; i < document.forms[0].elements.length; i++ ){
ddocument.forms[0].elements[i].onfocus = function() { test(this); };
}
function test(ele){
alert(ele.value);
}
答案 2 :(得分:0)
正如Nick和David所指出的,分配事件处理程序的方式不正确。但是,要实现您正在尝试的内容(在上下文中传递),您可以使用委托函数。像这样:
for (var i = 0; i < document.forms[0].elements.length; i++ ){
var ele = document.forms[0].elements[i];
ele.onfocus = delegate(ele, test);
}
function delegate(obj, handler) {
return function () {
handler.call(obj);
}
}
function test() {
alert(this.value);
}
delegate
函数的作用是调用处理函数设置this
的上下文。有关详细信息,请参阅Function object的文档。为了进一步阅读,我建议在Quirksmode上使用The this keyword和Introduction to events。