添加另一个处理程序?

时间:2011-07-31 23:35:56

标签: javascript event-handling

我有一个带有复杂“oninput”处理程序的标记,例如

 <input id="x" type="text" name="x"  
  oninput="lotsofgeneratedcocde...."/>

我想添加另一个只调用那个的处理程序。我最初的意思是这样可行:

 <input id="x" type="text" name="x"  
  oninput="lotsofgeneratedcocde...." onfocus="this.oninput"/>

但事实并非如此。我该怎么办?感谢。

编辑:我认为onfocus =“this.oninput”会复制对该函数的引用,这就是为什么我不再使用括号进行调用。

3 个答案:

答案 0 :(得分:4)

this.oninput()(注意括号内容)应该有效:

<input id="x" type="text" name="x"  
       oninput="console.log('test');" onfocus="this.oninput();"/>

http://jsfiddle.net/9kNrW/

答案 1 :(得分:2)

这可行吗?

... onfocus="this.oninput()"

我认为没有办法将生成的代码外包为可以从两个事件处理程序调用的正确函数......

答案 2 :(得分:1)

简答:
使用parens:onfocus="this.oninput();"

如果oninput引用this或事件对象,则需要添加更多内容:

onfocus="this.oninput.call(this, event);"

<强>解释
如果您在代码中附加事件处理程序,则语法是正确的。因为您正在设置功能参考。即,

myInput.onfocus = myInput.oninput;

但是,当附加在标记中时,引号之间的代码实际上本身就是一个函数。例如,

<span id="foo" onclick="alert('hello world');" />

相当于:

document.getElementById("foo").onclick = function () {
    alert('hello world');
};

因此,您编写的代码相当于:

document.getElementById("x").onfocus = function () {
    this.oninput; // returns a function reference.  Does not call the function.
};