Jquery insère une nouvelle ligne dans la table à un certain index

113

Je sais comment ajouter ou ajouter une nouvelle ligne dans une table en utilisant jquery:

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

Comment insérer la ligne (donnée dans la variable html) dans un "index de ligne" spécifique i. Donc, si i=3, par exemple, la ligne sera insérée en tant que 4ème ligne du tableau.

aeq
la source
pas le même, mais lié à stackoverflow.com/questions/171027/add-table-row-in-jquery
Nathan Koop

Réponses:

158

Vous pouvez utiliser .eq()et .after()aimer ceci:

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

Les index sont basés sur 0, donc pour être la 4ème ligne, vous devez i-1, puisque ce .eq(3)serait la 4ème ligne, vous devez revenir à la 3ème ligne ( 2) et l'insérer .after().

Nick Craver
la source
8
Il convient de noter que si la fonction eq de jQuery reçoit une valeur négative, elle bouclera jusqu'à la fin de la table. Donc, exécuter ceci et essayer de l'insérer sur l'index 0 entraînera l'insertion de la nouvelle ligne à la fin
rossisdead
2
Et ajoutez .before(html)si vous voulez l'insérer avant cet index
Abhi
1
cela échoue, s'il n'y a pas de lignes dans la table, est-ce que quelqu'un a une solution (basée sur un index) qui fonctionne même pour la première ligne?
MartinM
@MartinM si vous insérez même s'il n'y a pas de lignes , alors c'est un scénario totalement différent (où l'index n'a pas d'importance?) - voulez-vous ajouter à la fin quoi qu'il arrive?
Nick Craver
@NickCraver, non Je recherche juste une solution générale basée sur un index (comme celle-ci), mais ma table est vide au début ... Je peux bien sûr vérifier si la table est vide et insérer la première ligne, puis continuer avec votre méthode, mais cela ne me semble pas ellegant ..
MartinM
17

Essaye ça:

var i = 3;

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

ou ca:

var i = 3;

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

ou ca:

var i = 4;

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

Tous ces éléments placeront la ligne dans la même position. nth-childutilise un index basé sur 1.

utilisateur113716
la source
4

Remarque:

$('#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
la source
4

Je sais qu'il arrive tard, mais pour ceux qui veulent l'implémenter uniquement en utilisant le JavaScript, voici comment vous pouvez le faire:

  1. Obtenez la référence au courant sur trlequel vous avez cliqué.
  2. Créez un nouvel trélément DOM.
  3. Ajoutez-le au trnœud parent référencé .

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

Cela ajoutera la nouvelle ligne du tableau exactement en dessous de la ligne sur laquelle le bouton est cliqué.

Prateek
la source
2

essaye ça:

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

Utilisez le sélecteur d'égalisation pour sélectionner la nième ligne (basée sur 0) et ajoutez votre ligne après elle en utilisant after , donc:

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

où html est un tr

Adam
la source
1
$('#my_table tbody tr:nth-child(' + i + ')').after(html);
Arjan
la source
0

En plus de la réponse de Nick Craver et en tenant également compte du point soulevé par rossisdead, si le scénario existe comme s'il fallait l'ajouter à une table vide, ou avant une certaine ligne, j'ai fait comme ceci:

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

J'espère que ça aide quelqu'un.

Jaggan_j
la source
-1
$($('#my_table > tbody:last')[index]).append(html);
Eli Gray
la source
4
Cela entraînerait toujours une exception d'index hors plage.
Nick Craver