我有一个表,每行都需要一个点击功能。
我想将行号和文本发送到另一个函数。
当我点击一行时,它会为我提供正确的文本,但对于每一行,它会给出总行数。我如何给出点击的当前行的编号?
var table = document.getElementById("orders");
if (table != null) {
for (var i = 0; i < table.rows.length; i++) {
for (var j = 0; j < table.rows[i].cells.length; j++)
table.rows[i].cells[j].onclick = function () {
tableText(this, i);
};
}
}
function tableText(tableCell, i) {
alert(tableCell.innerHTML + i);
}
答案 0 :(得分:1)
您遇到了JavaScript var
范围界定的常见问题。问题是变量是for
循环本身的范围而不是块。这意味着变量随着for
的每次进一步迭代而不断变化。
您可以使用ES6 let
轻松解决此问题:
const table = document.getElementById("orders");
if (table != null) {
for (let i = 0; i < table.rows.length; i++) {
for (let j = 0; j < table.rows[i].cells.length; j++)
table.rows[i].cells[j].onclick = function () {
tableText(this, i);
};
}
}
(我改变了其他变量以获得最佳实践,但这并不是必需的。)
如果您不能使用ES6,您可以回退到这样的自执行功能:
for (var i = 0; i < table.rows.length; i++) {
for (var j = 0; j < table.rows[i].cells.length; j++) {
table.rows[i].cells[j].onclick = (function (i) {
return function () {
tableText(this, i);
};
})(i);
}
}
不是很好。
答案 1 :(得分:0)
如果不深入讨论,我怀疑alert
电话会同时评估innerHTML
和i
,以致您{{1}上的号码不正确}}。
我也会改变:
alert
明确说出
tableText(this, i);
只是为了避免任何可能的混淆。 tableText(table.rows[i].cells[j], i);
可能正在评估javascript / html文件本身