将onfocus事件处理程序添加到每个元素

时间:2010-12-10 11:55:27

标签: javascript

我在所有处理程序上收到一条未定义的消息。我想将处理程序绑定到每个元素,并希望输出值。这段代码有什么问题?谢谢!

 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);

 }

3 个答案:

答案 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 keywordIntroduction to events