如何通过';这';使用JavaScript将其转换为函数
我有以下代码,旨在为类名为“State”的所有元素创建onchange事件处理程序。唯一的问题是我希望将元素传递到“StateChange”函数中。如何更新此JS以将“this”传递到StateChange函数中?谢谢如何通过';这';使用JavaScript将其转换为函数,javascript,javascript-events,Javascript,Javascript Events,我有以下代码,旨在为类名为“State”的所有元素创建onchange事件处理程序。唯一的问题是我希望将元素传递到“StateChange”函数中。如何更新此JS以将“this”传递到StateChange函数中?谢谢 var c = document.getElementsByClassName('State'); for (i = 0; i < c.length; i++) c[i].onchange = createEventHandler( StateChange, c[i] );
var c = document.getElementsByClassName('State');
for (i = 0; i < c.length; i++) c[i].onchange = createEventHandler( StateChange, c[i] );
还有一些澄清。该函数的目的是避免将onchange事件放在类名为'State'的每个元素旁边。结果应该和我写的一样:
<select id="MyState1" class="State" onchange="StateChange(this)">
更新: 这是你最新的问题:你说过你想要的最终结果就像你做了这件事:
<select id="MyState1" class="State" onchange="StateChange(this)">
它所做的是返回一个函数,当事件被触发时,该函数将调用您传入的函数(StateChange
),并将this
设置为您传入的元素。。这使用了函数对象的JavaScript特性,它允许您定义函数调用期间该
将是什么。您只需将其作为第一个参数传递给调用
(后续参数传递给被调用的函数)
如果您想依赖这样一个事实,即设置处理程序的方式,this
将被设置为元素实例,您可以取消element
参数:
function createEventHandler(handler) {
return function(event) {
return handler.call(this, event || window.event);
};
}
它只传递由浏览器为事件处理程序设置的此
值
选项2:您希望此
=此
作为设置处理程序的位置
这和上面的原理是一样的,只是有一个不同的论点。在这种情况下,您需要在以下位置传递this
:
var c = document.getElementsByClassName('State');
for (i = 0; i < c.length; i++) c[i].onchange = createEventHandler( StateChange, this, c[i] );
(注意,我已将元素作为第二个参数传递给StateChange
)
更多阅读:
- 一种方法是:
var c = document.getElementsByClassName('State');
for (i = 0; i < c.length; i++)
c[i].onchange = createEventHandler(function(){
StateChange(c[i]);
});
var c=document.getElementsByClassName('State');
对于(i=0;i
看起来你已经做到了。c[i]应该是您所指的元素,因为i
总是指c.length
+1,因此c[i]
是未定义的。如果希望这样做,请使用一个自执行函数,该函数返回一个新函数,将其从当前迭代传递到c[i]
,并将其用作StateChange
的参数。例如,你是对的,Yoshi。Alf,我认为括号是匹配的,但正如Yoshi所说,要让它正常工作,你需要用另一个闭包来包装东西,以防止在循环结束时使用I的值。我以重要的方式更新了我的问题,使其更加清晰。谢谢你的帮助。@Mike:别担心,希望这对你有帮助。:-)关于这件事的简短跟进。。。如果我想为:,做同样的事情,我如何设置?我不知道如何指定返回它。@迈克:像这样:onkeydown=“return noNumbers(event,this)”
在noNumbers
中,元素将是第二个参数。或者,如果您愿意:onkeydown=“return noNumbers.call(this,event)”
并且在noNumbers
中,this
将引用元素,它将只接收一个参数(事件)。哦,我不是想问如何从事件调用传递“this”。我想问的是如何使用JS为该元素创建一个事件处理程序,以便它返回noNumbers(事件)。我当前的createEventHander()不能做到这一点。就像在上一个案例中一样,我希望最终结果就像我做了这件事:
var c = document.getElementsByClassName('State');
for (i = 0; i < c.length; i++) c[i].onchange = createEventHandler( StateChange, this, c[i] );
function createEventHandler(handler, thisArg, element) {
return function(event) {
return handler.call(thisArg, event || window.event, element);
};
}
var c = document.getElementsByClassName('State');
for (i = 0; i < c.length; i++)
c[i].onchange = createEventHandler(function(){
StateChange(c[i]);
});