Jquery inserta una nueva fila en la tabla en un índice determinado

113

Sé cómo agregar o anteponer una nueva fila en una tabla usando jquery:

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

Cómo insertar la fila (dada en la variable html) en un "índice de fila" específico i. Entonces i=3, si , por ejemplo, la fila se insertará como la cuarta fila de la tabla.

aeq
fuente
no es lo mismo, pero está relacionado con stackoverflow.com/questions/171027/add-table-row-in-jquery
Nathan Koop

Respuestas:

158

Puedes usar .eq()y .after()así:

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

Los índices están basados ​​en 0, por lo que para ser la cuarta fila, necesita i-1, ya .eq(3)que sería la cuarta fila, debe volver a la tercera fila ( 2) e insertarla .after().

Nick Craver
fuente
8
Debe notarse que si la función eq de jQuery recibe un valor negativo, se desplazará hasta el final de la tabla. Entonces, ejecutar esto e intentar insertarlo en el índice 0 hará que la nueva fila se inserte al final
rossisdead
2
Y agregue .before(html)si desea insertarlo antes de ese índice
Abhi
1
esto falla, si no hay filas en la tabla, ¿alguien tiene una solución (basada en índices) que funcione incluso para la primera fila?
MartinM
@MartinM si está insertando incluso si no hay filas , entonces ese es un escenario totalmente diferente (¿donde el índice no importa?) - ¿Quiere agregar al final sin importar qué?
Nick Craver
@NickCraver, no, solo estoy buscando una solución general basada en un índice (como esta), pero mi tabla está vacía al principio ... Puedo, por supuesto, verificar si la tabla está vacía e insertar la primera fila y luego continuar con su método, pero esto no me parece elegante ..
MartinM
17

Prueba esto:

var i = 3;

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

o esto:

var i = 3;

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

o esto:

var i = 4;

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

Todos estos colocarán la fila en la misma posición. nth-childutiliza un índice basado en 1.

usuario113716
fuente
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
fuente
4

Sé que llegará tarde, pero para aquellas personas que quieran implementarlo simplemente usando el JavaScript, así es como puede hacerlo:

  1. Obtenga la referencia a la corriente en la trque se hace clic.
  2. Crea un nuevo trelemento DOM.
  3. Agréguelo al trnodo padre 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>

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

Esto agregará la nueva fila de la tabla exactamente debajo de la fila en la que se hace clic en el botón.

Prateek
fuente
2

prueba esto:

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

Use el selector de ecualización para seleccionar la enésima fila (basada en 0) y agregue su fila después de ella usando after , así:

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

donde html es un tr

Adán
fuente
1
$('#my_table tbody tr:nth-child(' + i + ')').after(html);
Arjan
fuente
0

Agregando a la respuesta de Nick Craver y también considerando el punto planteado por rossisdead, si existe un escenario como si uno tuviera que agregarlo a una tabla vacía, o antes de una cierta fila, he hecho lo siguiente:

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 ayude a alguien.

Jaggan_j
fuente
-1
$($('#my_table > tbody:last')[index]).append(html);
Eli Grey
fuente
4
Esto siempre daría como resultado una excepción de índice fuera de rango.
Nick Craver