Як зробити перегляд рядків таблиці та комірок у JavaScript?


192

Якщо у мене є таблиця 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?

Відповіді:


304

Якщо ви хочете пройти кожен рядок ( <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
}

3
ex2, table.cells не сумісний із браузером
EricG

8
@WilliamRemacle Я опублікував цю відповідь майже 4 роки тому .. IE 9 тоді навіть не була думкою!
John Hartsock

@JohnHartsock Я знаю, але я використав ваше рішення і зрозумів, що він не працює на IE. Це лише коментар, щоб попередити інших ... Я все-таки проголосував вашу відповідь ;-)
Вільям Ремакл

функціонувати 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"); } Чому цей код не дозволив би мені переглядати таблицю, подібну до наведеної вище.
Дуг Хауф

Для тих, хто (приїжджаючи сюди через google), який потребує простого і невеликого пробілу table.cells(щоб виправити якийсь старший / орієнтований на IE код), дивіться мою відповідь на питання: Чи браузер Firefox не розпізнає table.cells?
GitaarLAB

67

Ви можете розглянути можливість використання jQuery. З jQuery це дуже просто і може виглядати так:

$('#mytab1 tr').each(function(){
    $(this).find('td').each(function(){
        //do your stuff, you can use $(this) to get current cell
    })
})

3
Неможливо використовувати jquery ... компанія не дозволяє. Не питайте, чому.
GregH

21
Це шалена політика. Ви завжди можете просто скопіювати-вставити відповідні функції, необхідні з jQuery, до власного коду програми. Якщо не існує політики щодо використання коду інших людей в Інтернеті, але тоді ви б тут не були.
Клінтон

13
@Judy: Не погоджуйся на "шалену політику" .... Є багато причин для того, щоб не використовувати jQuery
Bigjim

JQuery - це те, що я не використовував деякий час і, здається, лише з першого погляду щось складне і непросте, щоб обійти його. Але я думаю, що це просто тому, що я не використовував це все так сильно.
Дуг Хауф

5
Ще однією причиною заборонити JQuery є вбудовані веб-сайти, наприклад, я використовую вбудований чіп WiFi, який має лише 250 Кб для всього веб-сайту. Це стиснення з усіма зображеннями, як є.
Нік

16

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>

З кожним проходом через ітератор циклу r / c збільшується, а змінним рядків / комірок присвоюється новий об'єкт рядка / комірки з колекції. Коли в колекції більше рядків / комірок немає, помилка призначається змінній рядка / комірки та ітерації, коли цикл зупиняється (виходить).


у попередньому дописі: while (клітинка = рядок [r] .cells [c ++] повинна бути row.cells [c ++], рядок є поточним об'єктом, і приклад для коду sth: mycoldata = cell.innerHTML
fib Littul

12

Спробуйте

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


2
чистити , я б сказав
Совіте

3

Це рішення прекрасно працювало для мене

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 = "";
     }
}

Це навіть JavaScript? Тому що ваш цикл for виглядає дещо як PHP.
aravk33

2
Багато мов напрочуд схожі, коли знаєш, що шукати. PHP використовує $ перед кожною змінною, це не так. var - це також ключове слово, яке використовується JavaScript, а не PHP, хоча, якщо вони додали його, я, можливо, його пропустив. - edit- gah no enter for newline ... Як я кажу: Логіка є універсальною. Знати, як транскрибувати його на альтернативні мови - це надзвичайно корисний навик, який не важко засвоїти - ми є інтелектуальними істотами з чудовими здібностями відповідності зразком. Визначте зміни між кожною мовою або просто використовуйте визначення
лексерової

3

Якщо вам потрібен функціональний стиль, наприклад:

    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"]

Ви можете модифікувати об'єкт-прототип HTMLCollection (дозволяючи використовувати таким чином, що нагадує методи розширення в C #) і вбудувати в нього функцію, яка перетворює колекцію в масив, дозволяючи використовувати функції вищого порядку з вищевказаним стилем (вид стилю linq у C #):

    Object.defineProperty(HTMLCollection.prototype, "toArray", {
        value: function toArray() {
            return Array.prototype.slice.call(this, 0);
        },
        writable: true,
        configurable: true
    });

Uncaught TypeError: Неможливо прочитати властивість 'toArray' undefined -> Це те, що я отримав, коли спробував це рішення.
Vineela Thonupunuri

Дивно. Я спробував це знову, і це спрацювало. Я не зміг відтворити вказану вами помилку. Можливо, проблема в браузері. Я протестував за допомогою Edge та IE, і обидва не працювали. Chrome, Firefox та Safari працювали як очікувалося.
l30_4l3X

Я також використовував хром.
Vineela Thonupunuri

Це працює і для мене. Object.defineProperty, Очевидно , повинен йти до іншої частини коду, але це працює. @Vineela Thonupunuri Ви спробували це з кодом у правильному порядку?
FlippingBinary

3

Краще рішення: використовувати вбудований 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.rowIndexа cell.colIndexне використовувати row_indіcol_ind .

Я віддаю перевагу цей підхід поверх 2 вищі голосували відповіді , тому що це не захаращувати код з глобальними змінними i, j, rowіcol , і , отже, забезпечує чистий, модульний код , який не матиме жодних - яких побічних ефектів (або рейз пуху / попередження компілятора) ... без інших бібліотек (наприклад, jquery).

Якщо вам потрібно це запустити у старій версії (до ES2015) Javascript, Array.fromїї можна заповнити.


1

Ви можете використовувати .querySelectorAll()для вибору всіх tdелементів, а потім переведіть їх на .forEach(). Їх значення можна отримати за допомогою .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>

Якщо ви хочете вибрати лише стовпці з певного рядка, ви можете використовувати псевдоклас :nth-child()для вибору конкретного tr, необов'язково спільно з дочірнім комбінатором ( >) (що може бути корисно, якщо у вас є таблиця в таблиці):


1

Використання одинарного циклу:

var table = document.getElementById('tableID');  
var count = table.rows.length;  
for(var i=0; i<count; i++) {    
    console.log(table.rows[i]);    
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.