Jeśli mam tabelę HTML ... powiedz
<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>
Jak mógłbym iterować przez wszystkie wiersze tabeli (zakładając, że liczba wierszy może się zmieniać za każdym razem, gdy sprawdzam) i pobierać wartości z każdej komórki w każdym wierszu z poziomu JavaScript?
javascript
GregH
źródło
źródło
table.cells
(aby załatać starszy kod / zorientowany na IE), zobacz moją odpowiedź na pytanie : Czy przeglądarka Firefox nie rozpoznaje table.cells?Możesz rozważyć użycie jQuery. Dzięki jQuery jest to bardzo łatwe i może wyglądać tak:
$('#mytab1 tr').each(function(){ $(this).find('td').each(function(){ //do your stuff, you can use $(this) to get current cell }) })
źródło
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>
W każdym przejściu, podczas gdy iterator r / c pętli zwiększa się, a nowy obiekt wiersza / komórki z kolekcji jest przypisywany do zmiennych wiersza / komórki. Gdy w kolekcji nie ma już wierszy / komórek, do zmiennej wiersza / komórki przypisywane jest wartości false i przechodzi przez iterację podczas gdy pętla zatrzymuje się (kończy działanie).
źródło
Próbować
for (let row of mytab1.rows) { for(let cell of row.cells) { let val = cell.innerText; // your code below } }
Pokaż fragment kodu
for (let row of mytab1.rows) { for(let cell of row.cells) { console.log(cell.innerText) } }
<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>
Pokaż fragment kodu
for ( let [i,row] of [...mytab1.rows].entries() ) { for( let [j,cell] of [...row.cells].entries() ) { console.log(`[${i},${j}] = ${cell.innerText}`) } }
<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>
źródło
Lepsze rozwiązanie: użyj natywnego języka JavaScript
Array.from()
i przekonwertuj obiekt HTMLCollection na tablicę, po czym możesz użyć standardowych funkcji tablicowych.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); }); }); }
Możesz także odwołać się
tr.rowIndex
icell.colIndex
zamiast używaćrow_ind
icol_ind
.Wolę to podejście na szczyt najwyższej głosowało 2 odpowiedzi, ponieważ nie zaśmiecać swój kod ze zmiennych globalnych
i
,j
,row
icol
, a zatem zapewnia czystą, modułowy kod, który nie będzie miał żadnych skutków ubocznych (lub podnieść szarpie / ostrzeżenia kompilatora) ... bez innych bibliotek (np. jquery).Jeśli potrzebujesz tego do działania w starej wersji (przed ES2015) Javascript,
Array.from
można to wypełnić.źródło
To rozwiązanie działało idealnie dla mnie
var table = document.getElementById("myTable").rows; var y; for(i = 0; i < # of rows; i++) { for(j = 0; j < # of columns; j++) { y = table[i].cells; //do something with cells in a row y[j].innerHTML = ""; } }
źródło
Jeśli chcesz mieć funkcjonalny styl, taki jak ten:
const table = document.getElementById("mytab1"); const cells = table.rows.toArray() .flatMap(row => row.cells.toArray()) .map(cell => cell.innerHTML); //["col1 Val1", "col2 Val2", "col1 Val3", "col2 Val4"]
Możesz zmodyfikować prototypowy obiekt HTMLCollection (pozwalając na użycie w sposób podobny do metod rozszerzających w C #) i osadzić w nim funkcję, która konwertuje kolekcję na tablicę, pozwalając na użycie funkcji wyższego rzędu z powyższym stylem (rodzaj stylu linq w DO#):
Object.defineProperty(HTMLCollection.prototype, "toArray", { value: function toArray() { return Array.prototype.slice.call(this, 0); }, writable: true, configurable: true });
źródło
Object.defineProperty
Oczywiście musi iść przed resztą kodu, ale to działa. @Vineela Thonupunuri czy próbowałeś tego z kodem we właściwej kolejności?Możesz użyć,
.querySelectorAll()
aby zaznaczyć wszystkietd
elementy, a następnie zapętlić je za pomocą.forEach()
. Ich wartości można pobrać za pomocą.innerHTML
:const cells = document.querySelectorAll('td'); cells.forEach(function(cell) { console.log(cell.innerHTML); })
<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>
Jeśli chcesz wybrać tylko kolumny z określonego wiersza, możesz użyć pseudoklasy,
:nth-child()
aby wybrać konkretnątr
, opcjonalnie w połączeniu z kombinatorem potomnym (>
) (co może być przydatne, jeśli masz tabelę w tabeli):Pokaż fragment kodu
const cells = document.querySelectorAll('tr:nth-child(2) > td'); cells.forEach(function(cell) { console.log(cell.innerHTML); })
<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>
źródło
Używanie pojedynczej pętli for:
var table = document.getElementById('tableID'); var count = table.rows.length; for(var i=0; i<count; i++) { console.log(table.rows[i]); }
źródło