其他答案主要解释了如何解决闭包问题,尽管此类方法的内存效率不是特别高,因为它们最终会为i
和的每个可能组合创建一个新的闭包j
。
但是,由于您使用的是 jQuery,因此您可以使用许多其他选项:
data
将参数传递给.on
调用
td.on('click', { i: i, j: j }, function(event) {
var i = event.data.i;
var j = event.data.j;
alert(i + ' ' + j);
});
如您在上面看到的,i
和j
值将在event.data
用于$.each
迭代而不是for
$.each(Array(5), function(i) {
// i is already bound here because it's a function parameter
$.each(Array(5), function(j) {
// and j available here
td.on('click', ...);
});
});
使用事件委托而不是每个元素的处理程序
$('#myTable').on('click', 'td', function() {
// use jQuery methods to determine the index, e.g.
var j = this.cellIndex
var i = this.parentNode.rowIndex
...
});
这比将单独的处理程序单独绑定到每个处理程序更有效<td>
。
更一般地说,用于.data()
存储每个单元格的信息
您可以将数据值直接存储在元素上,如果您想检索除单元格和行索引以外的值,这将非常有效:
td = $('<td>').data({i: i, j: j});
然后直接从单击的元素中提取这些行和列值.data
:
for (var i = 0; i < 5; i++) {
var tr = $('<tr></tr>');
for (var j = 0; j < 5; j++) {
$('<td></td>').data({i: i, j: j}).appendTo(tr);
td.appendTo(tr);
}
}
$('#myTable').on('click', 'td', function() {
var data = $(this).data();
var i = data.i;
var j = data.j;
alert(i + ' ' + j);
});