Javascript 根据另一个处理程序添加一个处理程序?
我有一个带有复杂“oninput”处理程序的标记,例如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"
<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的性能较差;)我怀疑是这样的,但我不相信我肯定知道。我怀疑是这样的,但我不相信我肯定知道。