Jquery insere uma nova linha na tabela em um determinado índice

113

Eu sei como acrescentar ou preceder uma nova linha em uma tabela usando jquery:

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

Como eu insiro a linha (fornecida na variável html) em um "índice de linha" específico i. Portanto i=3, se , por exemplo, a linha for inserida como a 4ª linha da tabela.

aeq
fonte
não é o mesmo, mas está relacionado a stackoverflow.com/questions/171027/add-table-row-in-jquery
Nathan Koop

Respostas:

158

Você pode usar .eq()e .after()assim:

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

Os índices são baseados em 0, então para ser a 4ª linha, você precisa i-1, já .eq(3)que seria a 4ª linha, você precisa voltar para a 3ª linha ( 2) e inserir .after()isso.

Nick Craver
fonte
8
Deve-se notar que, se a função eq do jQuery receber um valor negativo, ela fará um loop até o final da tabela. Executar isso e tentar inseri-lo no índice 0 fará com que a nova linha seja inserida no final
rossisdead
2
E adicione .before(html)se quiser inseri-lo antes desse índice
Abhi
1
isso falha, se não houver linhas na tabela, alguém tem uma solução (baseada em índice) que funciona até mesmo para a primeira linha?
MartinM
@MartinM se você estiver inserindo mesmo que não haja linhas , esse é um cenário totalmente diferente (onde o índice não importa?) - você deseja acrescentar ao final, não importa o quê?
Nick Craver
@NickCraver, não, estou apenas procurando uma solução geral baseada em índice (como esta), mas minha tabela está vazia no início .. Posso, é claro, verificar se a tabela está vazia e inserir a primeira linha e depois continuar com seu método, mas isso não me parece
elegante
17

Experimente isto:

var i = 3;

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

ou isto:

var i = 3;

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

ou isto:

var i = 4;

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

Todos eles colocarão a linha na mesma posição. nth-childusa um índice baseado em 1.

user113716
fonte
4

Nota:

$('#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
Nilesh R. Makwana
fonte
4

Eu sei que está chegando tarde, mas para aquelas pessoas que desejam implementá-lo puramente usando o JavaScript, veja como você pode fazer isso:

  1. Obtenha a referência à corrente trque é clicada.
  2. Faça um novo trelemento DOM.
  3. Adicione-o ao trnó pai referido .

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>

Em 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;
    }

Isso adicionará a nova linha da tabela exatamente abaixo da linha na qual o botão foi clicado.

Prateek
fonte
2

tente isto:

$("table#myTable tr").last().after(data);
Agus Puryanto
fonte
1

Use o seletor eq para selecionar a enésima linha (base 0) e adicione sua linha depois dela usando depois , para:

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

onde html é um tr

Adão
fonte
1
$('#my_table tbody tr:nth-child(' + i + ')').after(html);
Arjan
fonte
0

Acrescentando à resposta de Nick Craver e também considerando o ponto levantado por rossisdead, se o cenário existe como se fosse necessário anexar a uma mesa vazia, ou antes de uma determinada linha, eu fiz assim:

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);
  }    
}

Espero que ajude alguém.

Jaggan_j
fonte
-1
$($('#my_table > tbody:last')[index]).append(html);
Eli Gray
fonte
4
Isso sempre resultaria em uma exceção de índice fora do intervalo.
Nick Craver