Elya: Probleme mit deleteRow bzw. Manipulation von Elementknoten

Hallo und ein frohes neues Jahr,

beim Manipulieren einer Tabelle via Javascript stehe ich gerade ein wenig auf dem Schlauch:

Gegeben ist eine kleine Datentabelle mit einem tbody, der die id "tbody" hat.

  
<tbody id="tbody">  
<tr>  
<td>Name 1</td><td>Wert 1</td>  
<td>Name 2</td><td>Wert 2</td>  
<td>Name 3</td><td>Wert 3</td>  
</tbody>  

Gewünscht ist die Anzeige nur der *letzten* Zeile dieses tbody, wobei je nach serverseitiger Ausgabe eine unterschiedliche Anzahl von Zeilen vorliegt.

Als Lösungsansatz dachte ich an ein "deleteRow" nach vorgerigem Durchzählen der Elemente im rows-Array.

Das will mir jedoch nicht gelingen. Sowohl die diversen Ausgabeversuche mit

  
alert(document.getElementById('tbody').rows);  
alert(document.getElementById('tbody').rows[0].firstChild.data);  

ergeben nur objects oder "undefined".

Ein vorheriges einfaches

  
document.getElementById('tbody').deleteRow(0)  

hat geklappt, aber das hilft mir bei der unbekannten Zahl von zeilen ja nicht weiter...

Das hängt ganz sicher mit meinem immer noch sehr rudimentären DOM-Verständnis zusammen, weshalb  ich um einen kleinen Stubs in die richtige Richtung bitte (eine fertige Lösung wäre ausnahmsweise auch mal ganz nett, da ich schon ziemlich lange dran rumfrickele und leicht blockiert bin... ,-)

Danke für Eure Tipps!

Gruß aus Köln-Ehrenfeld,

Elya

--
  1. Hallo Elya.

    Gegeben ist eine kleine Datentabelle mit einem tbody, der die id "tbody" hat.

    <tbody id="tbody">
    <tr>
    <td>Name 1</td><td>Wert 1</td>
    <td>Name 2</td><td>Wert 2</td>
    <td>Name 3</td><td>Wert 3</td>
    </tbody>

    
    >   
    > Gewünscht ist die Anzeige nur der \*letzten\* Zeile dieses tbody, wobei je nach serverseitiger Ausgabe eine unterschiedliche Anzahl von Zeilen vorliegt.  
    >   
    > Als Lösungsansatz dachte ich an ein "deleteRow" nach vorgerigem Durchzählen der Elemente im [rows-Array](http://de.selfhtml.org/javascript/objekte/htmlelemente.htm#tbody).  
    >   
    > Das will mir jedoch nicht gelingen. Sowohl die diversen Ausgabeversuche mit  
    >   
    > ~~~javascript
      
    
    > alert(document.getElementById('tbody').rows);  
    > alert(document.getElementById('tbody').rows[0].firstChild.data);  
    > 
    
    

    ergeben nur objects oder "undefined".

    Bei firstChild ist Vorsicht geboten, da du nie wissen kannst, ob der jeweilige Browser Whitespaces als Textknoten berücksichtigt, oder nicht. HTML-Elemente haben keine data-Eigenschaft, Textknoten schon.

    hat geklappt, aber das hilft mir bei der unbekannten Zahl von zeilen ja nicht weiter...

    Die Anzahl bekommst du im Übrigen, falls dies auch noch unklar ist, mittels table_oder_tbody.rows.length.

    Einen schönen Dienstag noch.

    Gruß, Mathias

    --
    ie:% fl:| br:< va:) ls:& fo:) rl:( n4:~ ss:) de:] js:| mo:| zu:)
    debian/rules
  2. n'abend,

    Gewünscht ist die Anzeige nur der *letzten* Zeile dieses tbody, wobei je nach serverseitiger Ausgabe eine unterschiedliche Anzahl von Zeilen vorliegt.

    Wenn du nur die letzte Zeile einer Tabelle möchtest, solltest du alle vorhergehenden löschen. Beispielsweise so:

    function stripLeadingRows()  
    {  
      var table = document.getElementById('testTable');  
      var rows = table.getElementsByTagName('tr');  
      
      while( 1 < rows.length )  
      {  
        rows[0].parentNode.removeChild( rows[0] );  
      }  
    }
    

    schöner wäre das natürlich, würdest du diese Funktion direkt der Tabelle anhängen (und somit als Methode der Tabelle benutzen).

    weiterhin schönen abend...

    --
    Freundlich wie man war, hat man mir Großbuchstaben geschenkt.
    sh:( fo:# ch:# rl:| br:> n4:& ie:{ mo:} va:) de:] zu:} fl:( ss:? ls:[ js:|
    1. Moin globe,

      Wenn du nur die letzte Zeile einer Tabelle möchtest, solltest du alle vorhergehenden löschen. Beispielsweise so: [...]

      Vielen Dank, das hat prima geklappt, mit der Einschränkung auf den tbody statt auf die table, weil ich die erste Reihe mit den th-Elementen noch brauchte...

      Die Variante mit length des row-arrays (mein Ansatz mit Mathias Brodalas Hilfe) hatte insofern einen Haken, als sich, wenn ich mit einer Schleife die Elemente lösche, im DOM zeitgleich auch die Anzahl der Elemente im Array zu ändern scheinen, so daß die Indizes sich innerhalb der Schleife ändern, das gab ein heilloses Durcheinander.

      Schönen Tag noch!

      Gruß aus Köln-Ehrenfeld,

      Elya

      --
      1. Hallo Elya.

        Die Variante mit length des row-arrays (mein Ansatz mit Mathias Brodalas Hilfe) hatte insofern einen Haken, als sich, wenn ich mit einer Schleife die Elemente lösche, im DOM zeitgleich auch die Anzahl der Elemente im Array zu ändern scheinen, so daß die Indizes sich innerhalb der Schleife ändern, das gab ein heilloses Durcheinander.

        Natürlich darfst du aus genau diesem Grund innerhalb der Schleife nicht length als Abbruchbedingung verwenden, sondern musst dessen Wert vorher zwischenspeichern und diesen resultierenden statischen Wert nutzen.

        Einen schönen Dienstag noch.

        Gruß, Mathias

        --
        ie:% fl:| br:< va:) ls:& fo:) rl:( n4:~ ss:) de:] js:| mo:| zu:)
        debian/rules
        1. Hello,

          Natürlich darfst du aus genau diesem Grund innerhalb der Schleife nicht length als Abbruchbedingung verwenden, sondern musst dessen Wert vorher zwischenspeichern und diesen resultierenden statischen Wert nutzen.

          oder du machst es so, wie ich es mir angewöhnt habe: von hinten nach vorne, d.h. keine inkrementierende Schleife sondern eine dekrementierende, beginnend bei length-2 (wenn der letzte Wert überleben soll) und endend bei 0.

          MfG
          Rouven

          --
          -------------------
          Buy when there's blood running in the street and sell when everyone is pounding at your door, clawing to own your equities  --  Wisdom on Wallstreet
          1. Hallo Rouven.

            Natürlich darfst du aus genau diesem Grund innerhalb der Schleife nicht length als Abbruchbedingung verwenden, sondern musst dessen Wert vorher zwischenspeichern und diesen resultierenden statischen Wert nutzen.
            oder du machst es so, wie ich es mir angewöhnt habe: von hinten nach vorne, d.h. keine inkrementierende Schleife sondern eine dekrementierende, beginnend bei length-2 (wenn der letzte Wert überleben soll) und endend bei 0.

            Stimmt, ist sinnvoller. Damit spart man sich die Hilfsvariable.

            Einen schönen Dienstag noch.

            Gruß, Mathias

            --
            ie:% fl:| br:< va:) ls:& fo:) rl:( n4:~ ss:) de:] js:| mo:| zu:)
            debian/rules
          2. Hi,

            Natürlich darfst du aus genau diesem Grund innerhalb der Schleife nicht length als Abbruchbedingung verwenden, sondern musst dessen Wert vorher zwischenspeichern und diesen resultierenden statischen Wert nutzen.

            oder du machst es so, wie ich es mir angewöhnt habe: von hinten nach vorne, d.h. keine inkrementierende Schleife sondern eine dekrementierende, beginnend bei length-2 (wenn der letzte Wert überleben soll) und endend bei 0.

            oder man löscht so lange das Element mit dem Index 0 (nichts incrementieren!), wie length>1 ist. Das geht dann elegant mit einer while-Schleife.

            Ciao,
             Martin

            --
            Wer morgens zerknittert aufsteht, hat den ganzen Tag Gelegenheit, sich zu entfalten.
        2. Hallo Mathias,

          Natürlich darfst du aus genau diesem Grund innerhalb der Schleife nicht length als Abbruchbedingung verwenden, sondern musst dessen Wert vorher zwischenspeichern und diesen resultierenden statischen Wert nutzen.

          Natürlich... War ja klar, daß ich heute noch nicht geradeausdenken kann ;-) Danke.

          Gruß aus Köln-Ehrenfeld,

          Elya

          --