Avatar billede groyk Novice
21. december 2008 - 21:02 Der er 13 kommentarer og
2 løsninger

tilføje row i tabel med JavaScript

Hej

Jeg bruger følgende kode til at kopiere en linie i en tabel.

function addNewRow(tableRef){
var tbl = document.getElementById(tableRef);
var oNewRow = tbl.rows[tbl.rows.length - 1].cloneNode(true);
if (tbl.childNodes[0].nodeName.toLowerCase() == "tbody"){
  tbl.childNodes[0].appendChild(oNewRow);
} else {
  tbl.appendChild(oNewRow);
}
}

Nu har jeg bare det problem at alle mine <input> felter får samme navne som ovenfor.

Hvordan ændre jeg efterfølgende navnene på den sidst indsatte række?
Avatar billede groyk Novice
21. december 2008 - 21:04 #1
Funktionen kan ses LIVE her
http://multipumpen.dk/shop/admin_ny/2.1.php
Avatar billede olebole Juniormester
21. december 2008 - 21:10 #2
<ole>

Du mangler sikkert et tbody-element i din tabel - og det er dét, du skal indsætte i. Et table element kan ikke have tr-elementer som børn  ;o)

/mvh
</bole>
Avatar billede olebole Juniormester
21. december 2008 - 21:13 #3
PS: Browserne indsætter selv tbody-elementet, hvis man glemmer det ... desværre, for så lærer folk det zq nok aldrig!  :o|

Dog _skal_ rækker indsættes under et tbody-, thead- eller tfoot-element - uanset, om browseren har rettet din kode eller ej. Derfor er det afgjort lettere selv at indsætte tbody'en, når man roder med DOM  ;o)
Avatar billede groyk Novice
22. december 2008 - 07:32 #4
Hej ole.

Du har ret i at jeg bruger <tr> i tabellen, men det er ikke der fejlen ligger. Jeg kan sagtens udvide tabellen, men de indput felter der er i tabellen får samme navn som rækken ovenfor. Det er det navn jeg gerne vil ændre.

vedr. <tbody> skal det gøres således?

alle <th> ændres til <thead>
alle <td> ændres til <tbody>
kan bruge <tfoot> i bunden hvis der er behov for det.
Avatar billede roenving Novice
22. december 2008 - 14:54 #5
Nope, du retter bare din kode til:

function addNewRow(tableRef){
var tbl = document.getElementById(tableRef).getElementsByTagName('tbody')[0];
var rows = tbl.childNodes;
var oNewRow = rows[rows.length - 1].cloneNode(true);
tbl.appendChild(oNewRow);
}
Avatar billede olebole Juniormester
22. december 2008 - 18:36 #6
- og lige for at ridse reglerne op, så skal en tabel som minimum indeholde ét tbody-element - men gerne flere. Derudover kan det indeholde ét caption-, thead- og/eller tfoot-element - samt et eller flere col- og colgroup-elementer. Et eksempel på dem alle kunne være:

<table border="1">
    <caption>En overskrift</caption>
    <col style="width:20%;">
    <colgroup style="background:yellow">
        <col style="width:50%">
        <col style="width:30%">
    </colgroup>
    <thead>
        <tr>
            <th>Bla 1</th>
            <th>Bla 2</th>
            <th>Bla 3</th>
        </tr>
    </thead>
    <tfoot>
        <tr>
            <td colspan="3">Noget tekst i footeren</td>
        </tr>
        <tr>
            <td>Fod 1</td>
            <td>Fod 2</td>
            <td>Fod 3</td>
        </tr>
    </tfoot>
    <tbody>
        <tr>
            <td>En celle</td>
            <td> - og en mere</td>
            <td> - og endnu en</td>
        </tr>
    </tbody>
    <tbody>
        <tr>
            <td>En celle</td>
            <td> - og en mere</td>
            <td> - og endnu en</td>
        </tr>
        <tr>
            <td>En celle</td>
            <td> - og en mere</td>
            <td> - og endnu en</td>
        </tr>
    </tbody>
</table>

Læg i øvrigt mærke til, at tfoot kommer før tbody. Det skyldes, at browseren så kan rendere både toppen og bunden af tabellen, inden selve indholdet loades. Alle elementerne kan have en eller flere rækker.
Avatar billede groyk Novice
22. december 2008 - 20:00 #7
Hej roenving

Tak for hjælpen, men som sagt er det ikke tabellen der giver mig problemer, men derimod inputfelterne i tabellen.

Det er inputfelterne der skal ændres navn på når en ny række oprettes!

Olebole
Tak for opsummeringen, det er altid rarest at lave tingene rigtigt første gang.
Avatar billede olebole Juniormester
22. december 2008 - 20:57 #8
IE har et issue med name-attributter, som den ikke kan sætte, så der er du lidt på spanden, når du kloner  :o|

Du må nok oprette nye elementer, og det er du i IE nødt til at gøre sådan:
    var sName = "et_navn";
    var oInp = document.createElement("<input type='text' name='"+sName+"'>");
Avatar billede groyk Novice
25. december 2008 - 13:52 #9
Hej Ole. Takker for tippet.

Har fået skiddet til at virke i IE og FF.

Her er koden

function addRowToTable(tableRef)
{
  var tbl = document.getElementById(tableRef);
  var lastRow = tbl.rows.length;
  // if there's no header row in the table, then iteration = lastRow + 1
  var iteration = lastRow-1;
  var row = tbl.insertRow(lastRow);

  // left cell
    for (i=0;i<fields.length;i++) {
      var cell = row.insertCell(i);
      var name= "r" + iteration + "[" + i + "]";
     
      if(IE==true) {
          var el = document.createElement("<input type='text' name=" + name + " onkeydown=\"refreshByClick('" + name + "', this.value, event)\" class=\"kolonne" + i + "\">");
      } else {
        // right invoice
        var el=document.createElement("input")
        el.setAttribute("type","text");
        el.setAttribute("name",name);
        el.setAttribute("class","kolonne" + i);
        el.setAttribute("onkeydown","refreshByClick('" + name + "', this.value, event)");
      }
     
      cell.appendChild(el);
    }
}


Nu er jeg kommet der til hvor jeg skal have smidt noget AJAX i til at hente varerlinier. har naturligvis læst "DenGodeKode" igennem og kopieret wrapperen.

Derudover har jeg læst en smule på følgende tråd
http://www.eksperten.dk/spm/817625

Men kan du give et bud på en basic dataopsamling via JSON ud fra "DenGodeKode"

Har indsat følgende fra din side.

1. Wrapperen

2. askServer
    function askServer(sQuery) {
        _oHttp = new XMLHttpRequest();
        _oHttp.open("post", "http://www.multipumpen.dk/shop/admin_ny/ajaxtest.php", true);
        _oHttp.onreadystatechange = function(){ myCallBack(_oHttp) };
        _oHttp.send(sQuery);
    }

?? Sendes evt. variabler i querystrengen som "normalt"?

3. myCallBack
// Ajax CallBack
    function myCallBack(oHttp) {
        if (oHttp.readyState<4) return;
          // Gør noget fornuftigt med responsen her (kode udeladt)
Meget fint, men hvad gør jeg præsist for ex. at hente et 1 eller 2 dimensionelt array fra en sql forespørgsel. Skal vel egentligt "bare" have det over i et JS array. ikke?
          // - og dræb derefter objektet
        oHttp = null;
    }


Håber du har noget "basic" du kan smide.

Naturligvis må du også gerne smide et svar som tak for hjælpen.
Avatar billede groyk Novice
25. december 2008 - 21:52 #10
Hej Ole

Brugte lige lidt tid på at sætte mig ind i det AJAX, nu virker det.

Hvis du vil se hvad jeg er kommet frem til indtil nu kan du naturligvis tage et kig på
http://multipumpen.dk/shop/admin_ny/2.1.php

Der skal tilføjes følgende funktionalitet endnu.
1. vælge kunde ud fra søgeliste (museklik)
2. AJAX kald af kundeoplysningerne til felter ud fra kundenr. (onblur)
3. Laves samme type søgning i vare felterne.
4. sletning af enkelte varer linier
5. div. andre inputfelter som ordredato, refnr. mm. (kundespecifik)

Til sidst kommer nok det sværreste.

Siden skal opdatere live med databasen, så der ikke skal gemmes ved tryk. (ligesom "normale" økonomisystemer)
Derudover er der selvfølgelig en kæmpe opgave i at lave validering af samtlige inputfelter.

Det er da egentligt meget sjovt det JavaScript når man først kommer i gang med det. :-)
Avatar billede groyk Novice
22. marts 2009 - 19:02 #11
Hej ole / roeving.
Kan i ikke smide et svar hver så jeg kan få lukket spørgsmålet?
Avatar billede olebole Juniormester
23. marts 2009 - 09:24 #12
Gerne  ;o)
Avatar billede roenving Novice
23. marts 2009 - 16:36 #13
Oki '-)
Avatar billede olebole Juniormester
24. marts 2009 - 22:25 #14
Tak for points  =)
Avatar billede roenving Novice
25. marts 2009 - 16:00 #15
-- også jeg siger tak for point ;~}
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester