我正在调用initListeners将侦听器附加到具有r#c#ID的许多元素。该事件应该触发对另一个函数的调用,该函数采用两个参数来识别元素r#和c#。
出于某种原因,对于所有细胞我只得到8:8 ...我的猜测是它是一个引用问题。有人可以建议修复吗?
ModelBoard.prototype.initListeners = function() {
var r=0, c=0;
for(r=0;r<=7;r++) {
for(c=0;c<=7;c++) {
$("#r" + r + "c" + c).click(function(){
board.click(r, c);
});
}
}
}
ModelBoard.prototype.click = function(r,c) {
alert(r + ":" + c);
}
答案 0 :(得分:1)
即使描述的问题与JavaScript closure inside loops – simple practical example
重复在不更改任何标记的情况下,您可以执行类似
的操作ModelBoard.prototype.initListeners = function () {
function clickHandler() {
var match = this.id.match(/r(\d+)c(\d+)/);
board.click(match[1], match[0]);
}
var r, c;
for (r = 0; r <= 7; r++) {
for (c = 0; c <= 7; c++) {
$("#r" + r + "c" + c).click(clickHandler);
}
}
}
ModelBoard.prototype.click = function (r, c) {
alert(r + ":" + c);
}
更合适的解决方案是将一个公共类(如rc
)添加到需要由click处理程序定位的所有元素,并使用该类来选择这些元素
ModelBoard.prototype.initListeners = function () {
$(".rc").click(function () {
var match = this.id.match(/r(\d+)c(\d+)/);
board.click(match[1], match[0]);
});
}