Javascript 根据另一个处理程序添加一个处理程序?

Javascript 根据另一个处理程序添加一个处理程序?,javascript,event-handling,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"

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

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

我想添加另一个处理程序,它只调用该处理程序。我最初的想法是,这会奏效:

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

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

编辑:我以为onfocus=“this.oninput”会将引用复制到函数中,这就是为什么我在调用时省略了括号。

这行得通吗

... onfocus="this.oninput()"
我假设无法将生成的代码作为适当的函数外包,您可以从两个事件处理程序调用这些函数…

这可以工作吗

... onfocus="this.oninput()"
我假设无法将生成的代码作为适当的函数外包,您可以从两个事件处理程序调用这些函数…

这一点。oninput()
(注意括号)应该可以工作:

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

这个.oninput()
(注意括号)应该可以:

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


简短回答:
使用参数:
onfocus=“this.oninput();”

如果
oninput
引用了
this
或事件对象,则需要再添加一点:

onfocus="this.oninput.call(this, event);"
说明:
如果在代码中附加事件处理程序,则语法是正确的。因为您正在设置函数引用。即

myInput.onfocus = myInput.oninput;
但是,当附加到标记中时,引号之间的代码本身就是一个函数。例如

<span id="foo" onclick="alert('hello world');" />
因此,您编写的代码相当于:

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

简短回答:
使用参数:
onfocus=“this.oninput();”

如果
oninput
引用了
this
或事件对象,则需要再添加一点:

onfocus="this.oninput.call(this, event);"
说明:
如果在代码中附加事件处理程序,则语法是正确的。因为您正在设置函数引用。即

myInput.onfocus = myInput.oninput;
但是,当附加到标记中时,引号之间的代码本身就是一个函数。例如

<span id="foo" onclick="alert('hello world');" />
因此,您编写的代码相当于:

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

this.oninput()
不起作用吗?@Jared它起作用了:@Šime Vidas-我知道,看看我上面的小提琴和下面的答案。当你说“复制对函数
的引用”时,你是什么意思?要调用事件处理程序,您需要引用元素、处理程序名称和
()`以使其作为函数而不是参数运行。最好将通用代码取出并作为函数放入.js文件中,然后从两个处理程序中引用该函数。更好的是,在文件中的JavaScript代码中,将函数作为事件处理程序附加到元素。如果将标记与JavaScript分开,您会发现代码更易于维护。
this.oninput()
不起作用吗?@Jared It:@Šime Vidas-我知道,请看我上面和下面的答案。当您说“将引用复制到函数
”时,您的意思是什么?要调用事件处理程序,您需要引用元素、处理程序名称和
()`以使其作为函数而不是参数运行。最好将通用代码取出并作为函数放入.js文件中,然后从两个处理程序中引用该函数。更好的是,在文件中的JavaScript代码中,将函数作为事件处理程序附加到元素。如果将标记与JavaScript分开,您会发现代码更易于维护。如果标记位于同一元素中,
this.oninput()
可以工作@杰瑞德:对,我也得到了同样的结果。但是你的回答更快。所以tpdi,如果你必须在Jared和我之间做出选择,请接受Jared的回答。为了正确起见,我将进行更新。我不知道您是否需要更改答案(因为它没有错),这只是一个更详细的方法来做同样事情的示例。@Jared:好的,它没有错,但这个/您的方法肯定更干净。并且使用document.getElementById的性能较差;)如果它在同一个元素中,
this.oninput()
可以工作@杰瑞德:对,我也得到了同样的结果。但是你的回答更快。所以tpdi,如果你必须在Jared和我之间做出选择,请接受Jared的回答。为了正确起见,我将进行更新。我不知道您是否需要更改答案(因为它没有错),这只是一个更详细的方法来做同样事情的示例。@Jared:好的,它没有错,但这个/您的方法肯定更干净。并且使用document.getElementById的性能较差;)我怀疑是这样的,但我不相信我肯定知道。我怀疑是这样的,但我不相信我肯定知道。