如何在 JavaScript 中遍历表格行和单元格?

IT技术 javascript
2021-02-03 15:47:19

如果我有一个 HTML 表格...说

<div id="myTabDiv">
<table name="mytab" id="mytab1">
  <tr> 
    <td>col1 Val1</td>
    <td>col2 Val2</td>
  </tr>
  <tr>
    <td>col1 Val3</td>
    <td>col2 Val4</td>
  </tr>
</table>
</div>

我将如何遍历所有表行(假设每次检查时行数都可能发生变化)并从 JavaScript 中的每一行中的每个单元格中检索值?

6个回答

如果你想遍历每一行(<tr>),知道/识别行(<tr>),并遍历每一行(<td>)的每一列(<tr>),那么这就是要走的路。

var table = document.getElementById("mytab1");
for (var i = 0, row; row = table.rows[i]; i++) {
   //iterate through rows
   //rows would be accessed using the "row" variable assigned in the for loop
   for (var j = 0, col; col = row.cells[j]; j++) {
     //iterate through columns
     //columns would be accessed using the "col" variable assigned in the for loop
   }  
}

如果您只想通过单元格(<td>),而忽略您所在的行,那么这就是要走的路。

var table = document.getElementById("mytab1");
for (var i = 0, cell; cell = table.cells[i]; i++) {
     //iterate through cells
     //cells would be accessed using the "cell" variable assigned in the for loop
}
对于那些(通过谷歌来到这里)需要一个简单的小垫片table.cells(以修补一些旧的/面向 IE 的代码)的人,请参阅问题的回答:Firefox 浏览器不识别 table.cells 吗?
2021-03-15 15:47:19
ex2,table.cells 与浏览器不兼容
2021-03-21 15:47:19
函数 itTable() { document.writeln("itTable"); var table = document.getElementById("mytab"); for (var i = 0, row; row = table.rows[i]; i++) { document.writeln(i); for (var j = 0, col; col = row.cells[j]; j++) { document.writeln(j); } } document.writeln("end-itTable"); 为什么这段代码不让我遍历类似于上面的表。
2021-03-27 15:47:19
@WilliamRemacle 我在大约 4 年前发布了这个答案......当时甚至没有想到 IE 9!
2021-03-29 15:47:19
@JohnHartsock 我知道,但我使用了您的解决方案并发现它不适用于 IE。这只是警告其他人的评论......无论如何我投票赞成你的答案;-)
2021-04-06 15:47:19

你可以考虑使用jQuery。使用 jQuery 非常简单,可能看起来像这样:

$('#mytab1 tr').each(function(){
    $(this).find('td').each(function(){
        //do your stuff, you can use $(this) to get current cell
    })
})
禁止 JQuery 的另一个原因是嵌入式网站,例如我使用的是嵌入式 WiFi 芯片,整个网站只有 250Kb。这是对所有图像的挤压。
2021-03-19 15:47:19
不能使用 jquery...公司不允许。不要问为什么。
2021-03-23 15:47:19
jQuery 在需要 2-3 个函数的地方没用。与 PHP 一起编码时,它既缓慢又令人困惑。
2021-03-28 15:47:19
这是一个疯狂的政策。您总是可以将您需要的相关函数从 jQuery 复制粘贴到您自己的应用程序代码中。除非有禁止在线使用其他人代码的政策,否则您就不会在这里。
2021-04-02 15:47:19
@Judy:不同意“疯狂政策”.... 有很多理由不使用 jQuery
2021-04-09 15:47:19

尝试

for (let row of mytab1.rows) 
{
    for(let cell of row.cells) 
    {
       let val = cell.innerText; // your code below
    }
}

简约、优雅、实用,卓越贡献
2021-03-11 15:47:19
注意循环中的“for ... of”。如果能在您的回答中提供一些解释,那就太好了。developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
2021-04-06 15:47:19
干净我会说
2021-04-07 15:47:19

var table=document.getElementById("mytab1");
var r=0; //start counting rows in table
while(row=table.rows[r++])
{
  var c=0; //start counting columns in row
  while(cell=row.cells[c++])
  {
    cell.innerHTML='[R'+r+'C'+c+']'; // do sth with cell
  }
}
<table id="mytab1">
  <tr>
    <td>A1</td><td>A2</td><td>A3</td>
  </tr>
  <tr>
    <td>B1</td><td>B2</td><td>B3</td>
  </tr>
  <tr>
    <td>C1</td><td>C2</td><td>C3</td>
  </tr>
</table>

在每次通过 while 循环 r/c 迭代器增加时,集合中的新行/单元格对象被分配给行/单元格变量。当集合中没有更多行/单元格时,将 false 分配给行/单元格变量并在循环停止(退出)时进行迭代。

在上一篇文章中:while (cell=row[r].cells[c++] 应该是 row.cells[c++],row 是当前对象,还有一个代码示例:mycoldata = cell.innerHTML
2021-03-21 15:47:19

更好的解决方案:使用 Javascript 的原生Array.from()并将 HTMLCollection 对象转换为数组,之后您可以使用标准数组函数。

var t = document.getElementById('mytab1');
if(t) {
    Array.from(t.rows).forEach((tr, row_ind) => {
        Array.from(tr.cells).forEach((cell, col_ind) => {
            console.log('Value at row/col [' + row_ind + ',' + col_ind + '] = ' + cell.textContent);
        });
    });
}

您也可以参考tr.rowIndexandcell.colIndex而不是使用row_indand col_ind

与前 2 个最高投票答案相比,我更喜欢这种方法,因为它不会使您的代码与全局变量ijrowcol混淆,因此它提供了干净的module化代码,不会产生任何副作用(或引发 lint / 编译器警告) ...没有其他库(例如jquery)。

如果您需要它在旧版本(ES2015 之前)的 Javascript 中运行,则Array.from可以使用 polyfill。