JQuery вставляет новую строку в таблицу по определенному индексу

113

Я знаю, как добавить или добавить новую строку в таблицу с помощью jquery:

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

Как вставить строку (указанную в переменной html) в определенный «индекс строки» i. Так, если i=3, например, строка будет вставлена ​​как 4-я строка в таблице.

Aeq
источник
не то же самое, но связано с stackoverflow.com/questions/171027/add-table-row-in-jquery
Nathan Koop

Ответы:

158

Вы можете использовать .eq()и .after()вот так:

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

Индексы основаны на 0, поэтому вам понадобится 4-я строка, i-1поскольку .eq(3)это будет 4-я строка, вам нужно вернуться к 3-й строке ( 2) и вставить ее .after().

Ник Крейвер
источник
8
Следует отметить, что если функции jQuery eq присвоено отрицательное значение, она будет перебираться до конца таблицы. Таким образом, запуск этого и попытка вставить его в индекс 0 приведет к вставке новой строки в конце
rossisdead
2
И добавьте, .before(html)если хотите вставить его перед этим указателем
Abhi
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.

user113716
источник
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;
    }

Это добавит новую строку таблицы точно под строкой, в которой была нажата кнопка.

Prateek
источник
2

попробуй это:

$("table#myTable tr").last().after(data);
Агус Пурьянто
источник
1

Используйте селектор eq, чтобы выбрать n-ю строку (начиная с 0) и добавить свою строку после нее, используя after , поэтому:

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

где html - это tr

Адам
источник
1
$('#my_table tbody tr:nth-child(' + i + ')').after(html);
Арьян
источник
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);
  }    
}

Надеюсь, это кому-то поможет.

Jaggan_j
источник
-1
$($('#my_table > tbody:last')[index]).append(html);
Эли Грей
источник
4
Это всегда приводило к исключению индекса вне допустимого диапазона.
Ник Крейвер