1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
<!DOCTYPE HTML> <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8" /> <script type="text/javascript"> function ad_row() { var data = { menge : { type : 'number', size : 8 }, bezeichnung : { type : 'text', size : 40 }, euro_stueck : { type : 'text', size : 12 } }; var table_id = 'product'; var table = document.getElementById( table_id ); var rows = table.getElementsByTagName( 'tr' ).length; var tr = table.insertRow( rows ); var count = 0; for ( name in data ) { count++; var td = document.createElement( 'td' ); var input = document.createElement( 'input' ); input.name = name + '_' + count; for ( attr in data[name] ) { input[attr] = data[name][attr]; } td.appendChild( input ); tr.appendChild( td ); } } </script> </head> <body> <table id="product"> </table> <br /> <form> <input type="button" onclick="ad_row()" value="Zeile hinzufügen" /> <br /><br /> <input type="submit" value="OK"/> </form> </body> </html>
2011-08-26T17:59:03 KuerbisGibt es hier einen Weg, die Parameter nicht einzeln zu übergeben, sondern alle in einem JSON-String?
2011-08-26T18:55:59 KuerbisWie mache ich das sonst (in der nächsten Seite, die diese Parameter verarbeiten soll)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
<!DOCTYPE HTML> <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8" /> <script type="text/javascript"> function ad_row() { var data = { menge : { type : 'number' }, bezeichnung : { type : 'text' }, euro_stueck : { type : 'text' }, count : { type : 'hidden' } }; var table_id = 'product'; var table = document.getElementById( table_id ); var rows = table.getElementsByTagName( 'tr' ).length; var tr = table.insertRow( rows ); for ( name in data ) { var td = document.createElement( 'td' ); var input = document.createElement( 'input' ); if ( name == 'count' ) { input.name = name; input.value = rows; } else { input.name = name + '_' + rows; } for ( attr in data[name] ) { input[attr] = data[name][attr]; } td.appendChild( input ); tr.appendChild( td ); } } </script> </head> <body> <form action="print"> <table id="product"> <tr><th>Menge</th><th>Bezeichnung</th><th>Euro/Stück</th></tr> <tr> <td><input type="number" name="menge_1" /></td> <td><input type="text" name="bezeichnung_1" /></td> <td><input type="text" name="euro_stueck_1" /></td> <td><input type="hidden" name="count" value="1" /></td> </tr> </table> <br /> <input type="button" value="Eintrag hinzufügen" onclick="ad_row()" /> <br /><br /> <br /><input type="submit" value="OK"/> </form> </body> </html>
1 2 3 4 5 6 7 8 9 10
my $count = ( $self->param( 'count' ) )[-1]; my @rows; for my $i ( 1 .. $count ) { push @rows, { menge => $self->param( "menge_$i" ), bezeichnung => $self->param( "bezeichnung_$i" ), euro_stueck => $self->param( "euro_stueck_$i" ), euro_gesamt => $self->param( "menge_$i" ) * $self->param( "euro_stueck_$i" ) }; }
2011-08-27T08:48:49 KuerbisIst das so in Ordnung?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
<!DOCTYPE HTML> <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8" /> <script type="text/javascript"> function ad_row() { var data = { menge : { type : 'number' }, bezeichnung : { type : 'text' }, euro_stueck : { type : 'text' }, count : { type : 'hidden' } }; var table = document.getElementById( 'product' ); var rows = table.getElementsByTagName( 'tr' ).length; var tr = table.insertRow( rows ); for ( name in data ) { var td = document.createElement( 'td' ); var input = document.createElement( 'input' ); if ( name == 'count' ) { input.name = name; input.value = rows; } else { input.name = name + '_' + rows; } for ( attr in data[name] ) { input[attr] = data[name][attr]; } td.appendChild( input ); tr.appendChild( td ); } } function remove_last_row() { var table = document.getElementById( 'product' ); var tbody = table.getElementsByTagName( 'tbody' ); tbody[0].removeChild( tbody[0].lastChild ); } </script> </head> <body> <form> <table id="product"> <tr><th>Menge</th><th>Bezeichnung</th><th>Euro/Stück</th></tr> <tr> <td><input type="number" name="menge_1" /></td> <td><input type="text" name="bezeichnung_1" /></td> <td><input type="text" name="euro_stueck_1" /></td> <td><input type="hidden" name="count" value="1" /></td> </tr> </table> <br /> <input type="button" value="Eintrag hinzufügen" onclick="ad_row()" /> <br /> <input type="button" value="Letzten Eintrag entfernen" onclick="remove_last_row()" /> <br /><br /> <br /><input type="submit" value="OK"/> </form> </body> </html>
2011-08-28T16:58:21 KuerbisIch habe noch ein paar Fragen zur remove_last_row()[/quote] Funktion: Wird [c]tbody immer automatisch erzeugt
2011-08-28T16:58:21 Kuerbisan kann eine Tabelle immer nur einen tbody haben?
2011-08-28T16:58:21 KuerbisIst es ok hier einfach tbody[0] schreiben, ohne zu kontrollieren, wieviele es gibt?
2011-08-28T16:58:21 KuerbisWüdet ihr einen solchen "Letzen Eintrag entfernen" Button als zu umständlich, überflüssig ansehen oder ist es ok?
QuoteWenn Sie kein solches Element angeben, gelten alle Zeilen der Tabelle als Tabellenkörper.
2011-08-29T05:28:33 KuerbisDiese Stelle aus der verlinkten Seite lese ich so, dass tbody automatisch erzeugt wird.
var last_tr = table.lastChild;
2011-08-29T05:56:09 Kuerbisdas hat mir dann unerwarteterweise ein tbody zurückgegeben.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
<!DOCTYPE HTML> <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8" /> <script type="text/javascript"> function ad_row() { var data = { menge : { type : 'number', }, bezeichnung : { type : 'text', }, euro_stueck : { type : 'text', }, count : { type : 'hidden' }, remove : { type : 'button', value : ' - ' }, }; var table = document.getElementById( 'product' ); var rows = table.getElementsByTagName( 'tr' ).length; var tr = table.insertRow( rows ); tr.id = 'tr_' + rows; for ( name in data ) { var td = document.createElement( 'td' ); var input = document.createElement( 'input' ); for ( attr in data[name] ) { input[attr] = data[name][attr]; } if ( name == 'count' ) { input.name = name; input.value = rows; } else if ( name == 'remove' ) { input.onclick = "remove_row('" + tr.id + "')"; } else { input.name = name + '_' + rows; } td.appendChild( input ); tr.appendChild( td ); } } function remove_row( tr_id ) { var this_tr = document.getElementById( tr_id ); var tbody = this_tr.parentNode; tbody.removeChild( this_tr ); } </script> </head> <form> <table id="product"> <tr id="tr_0"><th>Menge</th><th>Bezeichnung</th><th>Euro/Stück</th></tr> <tr id="tr_1"> <td><input type="number" name="menge_1" /></td> <td><input type="text" name="bezeichnung_1" /></td> <td><input type="text" name="euro_stueck_1" /></td> <td><input type="hidden" name="count" value="1" /></td> <td><input type="button" value=" - " onclick="remove_row('tr_1')" /></td> </tr> </table> <br /> <input type="button" value="Eintrag hinzufügen" onclick="ad_row()" /> <br /> <input type="submit" value="OK"/> </form> </body> </html>
2011-08-29T08:32:58 Kuerbisaber die Zuweisung der remove_row Funktion an das input.onclick Attribut funktioniert nicht.
2011-08-29T09:31:16 KuerbisBei der ersten Reihe gehts, bei allen hinzugefügten nicht mehr.
input.onclick = my_funktion;
input.onclick = my_funktion();
input.onclick = function () {remove_row(tr.id);};
2011-08-29T11:34:00 KuerbisCode (javascript): (dl )input.onclick = function () {remove_row(tr.id);};
verhält sich wie eine Art closure, das locale tr.id ist beim input.onclick Aufruf noch gültig.
2011-08-29T11:17:52 GwenDragonIch hoffe, das JS wird auch in genügend Browsern auf Funktionsfähigkeit getestet.
QuoteDie type Eigenschaften wurden nicht gefunden. Ungültiges Argument.
2011-09-01T10:18:19 GwenDragonOder hast du einen Javascript-Fehler in Internet Explorer angezeigt bekommen?
2011-09-01T14:36:04 GwenDragonDann muss du eben mit try und catch arbeiten und die Fehler abfangen.
2011-09-01T14:36:04 GwenDragonWas ich dir empfehle, wenn du browserübergreifend arbeiten willst und dein jetziger Code nicht nur zum Lernen, also für die Praxis gemacht wurde, ist die Verwendung von JS-Bibliotheken wie jQuery u. ä.
2011-09-01T20:05:10 Kuerbisalle inputs haben als Attribute required="required"
2011-09-02T05:21:46 KuerbisIst "required" auch neu?
2011-09-01T07:27:27 KuerbisHabe etwas gefunden:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
<!DOCTYPE HTML> <html> <head> <title>Eingabe</title> <meta http-equiv="content-type" content="text/html; charset=UTF-8" /> <script type="text/javascript"> function remove_row( tr_id ) { var this_tr = document.getElementById( tr_id ); var tbody = this_tr.parentNode; tbody.removeChild( this_tr ); } function add_row() { var data = { menge : { type : "number", pattern : "\\d+", title : "'Menge' must only contain numbers", size : 8, maxlength : 80, required : "required", autocomplete : "off" }, bezeichnung : { type : "text", size : 40, maxlength : 80, required : "required", autocomplete : "off" }, euro_stueck : { type : "text", pattern : "\\d+(\\,\\d{1,2})?", title : "format: 0,00", size : 12, maxlength : 80, required : "required", autocomplete : "off" }, count : { type : "hidden" }, remove : { type : "button", value : ' - ' } }; var table = document.getElementById( 'product' ); var rows = table.getElementsByTagName( 'tr' ).length; if ( rows > 999 ) { alert( 'Nur 999 Zeilen erlaubt' ); return; } var tr = table.insertRow( rows ); tr.id = 'tr_' + rows; var rr = function() { remove_row( tr.id ); }; for ( var name in data ) { if ( data.hasOwnProperty( name ) ) { var td = document.createElement( 'td' ); var input = document.createElement( 'input' ); for ( var attr in data[name] ) { if ( data[name].hasOwnProperty( attr ) ) { input[attr] = data[name][attr]; } } if ( name == 'count' ) { input.name = name; input.value = rows; } else if ( name == 'remove' ) { input.onclick = rr; input.name = name + '_' + rows; } else { input.name = name + '_' + rows; } td.appendChild( input ); tr.appendChild( td ); } } window.scrollTo( 0, document.body.scrollHeight ); } </script> </head> <body> <form> <table id="product"> <tr id="tr_0"><th>Menge</th><th>Bezeichnung</th><th>Euro/Stück</th></tr> <tr id="tr_1"> <td><input type="number" pattern="\d+" title="'Menge' must only contain numbers" name="menge_1" required size="08" autocomplete="off" /></td> <td><input type="text" name="bezeichnung_1" required size="40" maxlength="80" autocomplete="on" /></td> <td><input type="text" pattern="\d+(\,\d{1,2})?" title="format: 0,00" name="euro_stueck_1" required size="12" autocomplete="off" /></td> <td><input type="hidden" name="count" value="1" /></td> <td><input type="button" name="remove_1" value=" - " onclick="remove_row('tr_1')" /></td> </tr> </table> <br /> <input id="add" type="button" value="Eintrag hinzufügen" onclick="add_row()" /> <br /><br /> <input type="submit" value="OK"/> </form> </body> </html>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
my $eu = new Number::Format( -thousands_sep => '.', -decimal_point => ',', -int_curr_symbol => "\x{20ac}", ); my @count = $self->param( 'count' ); my @rows; for my $i ( sort { $a <=> $b } @count ) { my $euro_stueck = $eu->unformat_number( $self->param( "euro_stueck_$i" ) ); my $menge = $eu->unformat_number( $self->param( "menge_$i" ) ); my $euro_gesamt = $euro_stueck * $menge; $menge = $eu->format_number( $menge ); $euro_stueck = $eu->format_price( $euro_stueck, 2 ); $euro_gesamt = $eu->format_price( $euro_gesamt, 2 ); push @rows, { menge => $menge, bezeichnung => $self->param( "bezeichnung_$i" ), euro_stueck => $euro_stueck, euro_gesamt => $euro_gesamt, }; }