Jquery вставити новий рядок у таблицю з певним індексом


113

Я знаю, як додати чи додати новий рядок до таблиці за допомогою jquery:

$('#my_table > tbody:last').append(html);

Як вставити рядок (вказану в змінній html) у конкретний "індекс рядка" i. Так, якщо i=3, наприклад, рядок буде вставлено як 4-й рядок у таблиці.


не те саме, але пов’язане з stackoverflow.com/questions/171027/add-table-row-in-jquery
Натан Кооп

Відповіді:


158

Ви можете використовувати .eq()і .after()як це:

$('#my_table > tbody > tr').eq(i-1).after(html);

Індекси базуються на 0, тому, щоб бути 4-м рядком, вам потрібно i-1, оскільки це .eq(3)був би 4-й рядок, вам потрібно повернутися до 3-го рядка ( 2) і вставити .after()це.


8
Слід зауважити, що якщо функції еквіваленту jQuery присвоєно негативне значення, воно обернеться до кінця таблиці. Отож, якщо запустити це та спробувати вставити його в індекс 0, то в кінці буде вставлено новий рядок
rossisdead

2
І додайте, .before(html)якщо ви хочете вставити його перед цим індексом
Абхі

1
це не вдається, якщо в таблиці немає рядків, чи є у когось рішення (на основі індексу), яке працює навіть для першого ряду?
MartinM

@MartinM, якщо ви вставляєте, навіть якщо рядків немає , то це зовсім інший сценарій (де індекс не має значення?) - ви хочете додати його до кінця незалежно від того?
Нік Крейвер

@ NickCraver, ні, я просто шукаю загальне рішення на основі індексу (як це), але моя таблиця на початку запущена. Я, звичайно, можу перевірити, чи таблиця порожня, і вставити перший рядок, а потім продовжити з ваш метод, але це здається мені не елегантним ..
MartinM

17

Спробуйте це:

var i = 3;

$('#my_table > tbody > tr:eq(' + i + ')').after(html);

або це:

var i = 3;

$('#my_table > tbody > tr').eq( i ).after(html);

або це:

var i = 4;

$('#my_table > tbody > tr:nth-child(' + i + ')').after(html);

Усі вони розмістять рядок в одному положенні. nth-childвикористовує індекс на основі 1.


4

Примітка:

$('#my_table > tbody:last').append(newRow); // this will add new row inside tbody

$("table#myTable tr").last().after(newRow);  // this will add new row outside tbody 
                                             //i.e. between thead and tbody
                                             //.before() will also work similar

4

Я знаю, що вже пізно, але для тих людей, які хочуть реалізувати це лише за допомогою програми JavaScript, ось як це зробити:

  1. Отримайте посилання на струм, на trякий натиснули.
  2. Створіть новий trелемент DOM.
  3. Додайте його до згаданого trбатьківського вузла.

HTML:

<table>
     <tr>
                    <td>
                        <button id="0" onclick="addRow()">Expand</button>
                    </td>
                    <td>abc</td>
                    <td>abc</td>
                    <td>abc</td>
                    <td>abc</td>
     </tr>

     <tr>
                    <td>
                        <button id="1" onclick="addRow()">Expand</button>
                    </td>
                    <td>abc</td>
                    <td>abc</td>
                    <td>abc</td>
                    <td>abc</td>
     </tr>
     <tr>
                    <td>
                        <button id="2" onclick="addRow()">Expand</button>
                    </td>
                    <td>abc</td>
                    <td>abc</td>
                    <td>abc</td>
                    <td>abc</td>
     </tr>

У JavaScript:

function addRow() {
        var evt = event.srcElement.id;
        var btn_clicked = document.getElementById(evt);
        var tr_referred = btn_clicked.parentNode.parentNode;
        var td = document.createElement('td');
        td.innerHTML = 'abc';
        var tr = document.createElement('tr');
        tr.appendChild(td);
        tr_referred.parentNode.insertBefore(tr, tr_referred.nextSibling);
        return tr;
    }

Це додасть новий рядок таблиці рівно під рядком, на якому натискається кнопка.



1

Використовуйте селектор eq для виділення n-го рядка (на основі 0) і додайте рядок після нього, використовуючи після , так:

$('#my_table > tbody:last tr:eq(2)').after(html);

де html - це tr



0

Додаючи до відповіді Ніка Крейвера, а також розглядаючи питання, підняте rossisdead, якщо такий сценарій існує, як один повинен додаватися до порожньої таблиці або до певного рядка, я зробив так:

var arr = []; //array
if (your condition) {
  arr.push(row.id); //push row's id for eg: to the array
  idx = arr.sort().indexOf(row.id);

  if (idx === 0) {   
    if (arr.length === 1) {  //if array size is only 1 (currently pushed item)
        $("#tableID").append(row);
    }
    else {       //if array size more than 1, but index still 0, meaning inserted row must be the first row
       $("#tableID tr").eq(idx + 1).before(row);
    }   
  }          
  else {     //if index is greater than 0, meaning inserted row to be after specified index row
      $("#tableID tr").eq(idx).after(row);
  }    
}

Сподіваюся, це комусь допоможе.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.