三个选项:
使用生成器函数
通常的方法是为处理程序创建一个构建器函数:
for (var i = 1; i < CurrValue; i++) {
getId('btnReadRFIDTag_' + i).onclick = buildHandler(i);
}
function buildHandler(index) {
return function() {
ReadRFIDTag(getId('txtCode_' + index));
};
}
buildHandler 构建的函数会关闭来自对 buildHandler 的调用的 index 参数,而不是 i,因此它会看到正确的值。
使用 ES5 的Function#bind
如果您可以依赖 ES5(或者您包含 ES5 shim,因为这是一个可填充的功能),您可以使用 Function#bind:
// Using Function#bind (option 1)
for (var i = 1; i < CurrValue; i++) {
var elm = getId('btnReadRFIDTag_' + i);
elm.onclick = function(index) {
ReadRFIDTag(getId('txtCode_' + index));
}.bind(elm, i);
}
这样使用会产生不必要的额外功能,所以你也可以这样使用:
// Using Function#bind (option 2)
for (var i = 1; i < CurrValue; i++) {
var elm = getId('btnReadRFIDTag_' + i);
elm.onclick = myHandler.bind(elm, i);
}
function myHandler(index) {
ReadRFIDTag(getId('txtCode_' + index));
}
使用事件委托
如果它们都在一个容器中(当然,最终它们是,即使它只是 document.body),而不是在每个按钮上放置一个处理程序,您可以将处理程序放在该容器上,然后使用event.target 找出点击了哪个按钮。我不会用老式的onclick 这样做,但你可以用addEventListener 或attachEvent:
var container = /* ...get the container... */;
if (container.addEventListener) {
container.addEventListener('click', clickHandler, false);
}
else if (container.attachEvent) {
container.attachEvent('onclick', function(e) {
return clickHandler.call(this, e || window.event);
});
}
else {
// I wouldn't bother supporting something that doesn't have either
}
function clickHandler(e) {
var btn = e.target;
while (btn && btn !== this && btn.id.substring(0, 15) !== "btnReadRFIDTag_") {
btn = btn.parentNode;
}
if (btn && btn !== this) {
ReadRFIDTag(getId('txtCode_' + btn.id.substring(15)));
}
}
工作方式是将click 事件挂接到容器上,然后当点击冒泡(向下?)到它时,它会查看点击的来源并查看它是否(或它的祖先) ) 是我们关心的按钮之一。如果是,我们会采取行动。