Javascript 向每个元素添加onfocus事件处理程序

Javascript 向每个元素添加onfocus事件处理程序,javascript,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); } for(var i=0;i

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

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

 }
for(var i=0;i
您需要分配一个函数。此时,您正在分配
test(window)
的返回值,它是
未定义的

onfocus = test;
然后引用函数中的元素:

function test(){
    alert(this.value);
}

您需要同时更改赋值和函数,因为元素将不再作为参数传入,如下所示:

for (var i = 0; i < document.forms[0].elements.length; i++ ){
  document.forms[0].elements[i].onfocus = test;
}
function test(){
  alert(this.value);
}

正如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);
}
for(var i=0;i

委托
函数所做的是调用您的处理函数来设置该
的上下文。有关更多信息,请参阅文档以了解。为了更进一步的阅读,我建议您使用Quirksmode和。

您必须这样做。否则调用函数。在事件处理程序中,
将是事件附加到的元素。因此,将函数中的
evt
替换为
this
是完全有效的。对于这种方法,他应该省略
这个
,但这不应该是一个全局声明,有很多有效的闭包案例都有这样的签名:)
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);
}