JQuery wstawia nowy wiersz do tabeli pod określonym indeksem

113

Wiem, jak dołączyć lub poprzedzić nowy wiersz w tabeli za pomocą jquery:

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

Jak wstawić wiersz (podany w zmiennej html) do określonego „indeksu wiersza” i. Jeśli więc i=3, na przykład, wiersz zostanie wstawiony jako 4th wiersza w tabeli.

aeq
źródło
nie to samo, ale związane ze stackoverflow.com/questions/171027/add-table-row-in-jquery
Nathan Koop

Odpowiedzi:

158

Możesz użyć .eq()i .after()tak:

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

Indeksy są oparte na 0, więc aby być czwartym wierszem, potrzebujesz i-1, ponieważ .eq(3)byłby to czwarty wiersz, musisz wrócić do trzeciego wiersza ( 2) i wstawić go .after().

Nick Craver
źródło
8
Należy zauważyć, że jeśli funkcja eq jQuery otrzyma wartość ujemną, zapętli się do końca tabeli. Uruchomienie tego i próba wstawienia go do indeksu 0 spowoduje, że nowy wiersz zostanie wstawiony na końcu
rossisdead
2
I dodaj, .before(html)jeśli chcesz wstawić go przed tym indeksem
Abhi
1
to się nie powiedzie, jeśli nie ma wierszy w tabeli, czy ktoś ma rozwiązanie (oparte na indeksie), które działa nawet dla pierwszego wiersza?
MartinM
@MartinM, jeśli wstawiasz, nawet jeśli nie ma wierszy , to jest to zupełnie inny scenariusz (gdzie indeks nie ma znaczenia?) - czy chcesz dołączyć do końca bez względu na wszystko?
Nick Craver
@NickCraver, nie, szukam tylko ogólnego rozwiązania opartego na indeksach (w ten sposób), ale moja tabela jest na początku pusta. Mogę oczywiście sprawdzić, czy tabela jest pusta i wstawić pierwszy wiersz, a następnie kontynuować Twoja metoda, ale wydaje mi się to
nieeleganckie
17

Spróbuj tego:

var i = 3;

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

albo to:

var i = 3;

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

albo to:

var i = 4;

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

Wszystko to spowoduje umieszczenie wiersza w tej samej pozycji. nth-childużywa indeksu opartego na 1.

user113716
źródło
4

Uwaga:

$('#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
źródło
4

Wiem, że nadchodzi późno, ale dla osób, które chcą to wdrożyć wyłącznie przy użyciu narzędzia JavaScript, oto jak możesz to zrobić:

  1. Uzyskaj odniesienie do aktualnie trklikniętego.
  2. Utwórz nowy trelement DOM.
  3. Dodaj go do wskazanego trwęzła nadrzędnego.

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>

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

Spowoduje to dodanie nowego wiersza tabeli dokładnie poniżej wiersza, w którym kliknięto przycisk.

Prateek
źródło
2

Spróbuj tego:

$("table#myTable tr").last().after(data);
Agus Puryanto
źródło
1

Użyj selektora eq, aby wybrać n-ty wiersz (od 0) i dodaj swój wiersz po nim, używając after , więc:

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

gdzie html to tr

Adam
źródło
1
$('#my_table tbody tr:nth-child(' + i + ')').after(html);
Arjan
źródło
0

Dodając do odpowiedzi Nicka Cravera, a także biorąc pod uwagę kwestię podniesioną przez Rossisdeada, jeśli istnieje scenariusz, w którym trzeba dołączyć do pustej tabeli lub przed określonym wierszem, zrobiłem tak:

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

Mam nadzieję, że to komuś pomoże.

Jaggan_j
źródło
-1
$($('#my_table > tbody:last')[index]).append(html);
Eli Grey
źródło
4
Spowodowałoby to zawsze wyjątek indeksu spoza zakresu.
Nick Craver