我有以下代码,用于为类名为“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] );
编辑:我忘了提供createEventHandler函数。对不起...这是:
function createEventHandler(fn, input) {
return function () {
fn(input);
};
}
另外,一些澄清。该函数的目的是避免将onchange事件放在每个元素旁边的类名='State'的需要。结果应该和我写的一样:
<select id="MyState1" class="State" onchange="StateChange(this)">
答案 0 :(得分:6)
<强>更新强>
重新提出你的最新问题:你已经说过你想要的最终结果就好像你已经这样做了:
<select id="MyState1" class="State" onchange="StateChange(this)">
您引用的createEventHandler
函数完全正确。
原始答案:
我不完全确定我确切知道你要做什么。我至少可以通过两种方式阅读这个问题:
StateChange
函数调用中,您希望this
引用更改的元素。StateChange
函数调用中,您希望this
与设置事件处理程序的this
相同。this
StateChange
=元素
您实际上不必将元素实例传递到createEventHandler
,因为当事件发生时,this
将引用该元素,因为您将它连接起来。但如果您希望明确设置,createEventHandler
函数可能如下所示:
function createEventHandler(handler, element) {
return function(event) {
return handler.call(element, event || window.event);
};
}
这样做会返回一个函数,当事件被触发时,将调用您传入的函数(StateChange
)并将this
设置为您传入的element
。这使用了函数对象的JavaScript call
功能,允许您定义函数调用期间this
的内容。你只需将它作为第一个参数传递给call
(后续参数传递给被调用的函数)。
如果您想依赖于设置处理程序的方式,this
已经设置为元素实例,则可以取消element
参数:< / p>
function createEventHandler(handler) {
return function(event) {
return handler.call(this, event || window.event);
};
}
它只传递浏览器为事件处理程序设置的this
值。
this
= this
,因为您要设置处理程序这与上述原理相同,只是有不同的论点。在这种情况下,您需要传递this
in:
var c = document.getElementsByClassName('State');
for (i = 0; i < c.length; i++) c[i].onchange = createEventHandler( StateChange, this, c[i] );
...然后createEventHandler
看起来像这样:
function createEventHandler(handler, thisArg, element) {
return function(event) {
return handler.call(thisArg, event || window.event, element);
};
}
(注意我已将元素作为第二个参数传递给StateChange
。)
更多阅读:
答案 1 :(得分:0)
一种方法是:
var c = document.getElementsByClassName('State');
for (i = 0; i < c.length; i++)
c[i].onchange = createEventHandler(function(){
StateChange(c[i]);
});