letztes TR kopieren

Hallo

Ich habe den Fehler entdeckt und auch bei dir funktioniert es nicht korrekt. Das Problem ist, dass wir bei diesem Code Abschnitt die values auf 0 zurücksetzen

Code:
function cloneTR(){
  // Letzte Tabellenzeile clonen
  var objClone = document.getElementById("select_employee").rows[document.getElementById("select_employee").rows.length-1].cloneNode(true);

  // Inputinhalte löschen
  for(var i=0; i<objClone.getElementsByTagName("input").length; i++){
    objClone.getElementsByTagName("input")[i].value = "";
  }

  // Knoten einhängen
  document.getElementsByTagName("tbody")[0].appendChild(objClone);
}

Wie können wir nun einen Bereich auslassen, oder den Wert wieder in das Feld schreiben?
 
Wie...ich denke, du willst die values im geclonten Knoten löschen...oder etwa nicht?
Was meinst du mit "Bereich auslassen"?

Wenn es dir darum geht, die values der Checkboxen nicht zu Leeren, dann prüfe zusätzlich noch in diesem Abschnitt, ob der Typ des input "text" ist.

Weiterhin befürchte ich, musst du dir für die Checkboxen wohl etwas anderes einfallen lassen.
Grund: sobald irgendwo eine Checkbox nicht angeklickt wurde, ist es dir unmöglich, die Zugehörigkeit der übermittelten Checkboxen nachzuvollziehen.
 
Wie...ich denke, du willst die values im geclonten Knoten löschen...oder etwa nicht?
Was meinst du mit "Bereich auslassen"?

Wenn es dir darum geht, die values der Checkboxen nicht zu Leeren, dann prüfe zusätzlich noch in diesem Abschnitt, ob der Typ des input "text" ist.

Weiterhin befürchte ich, musst du dir für die Checkboxen wohl etwas anderes einfallen lassen.
Grund: sobald irgendwo eine Checkbox nicht angeklickt wurde, ist es dir unmöglich, die Zugehörigkeit der übermittelten Checkboxen nachzuvollziehen.

Deine Befürchtung trifft zu, genau dies habe ich nun auch festgestellt. Wie ärgerlich ....

Ist es nicht möglich, den Value der Checkbox, zu überprüfen, wenn deaktiviert, den Wert 2 zu übermitteln, und bei aktiviert den Wert 1. Das ganze natürlich bevor man es abschickt mittels JavaScript?

Weil eben, es benötigt einen Wert um die CheckBox zurück zu verfolgen. Man müsste also wenn die Checkbox nicht aktiviert ist, ein fiktiver Wert hineingeschrieben werden, nur wie dies gehen soll - keine Ahnung.

Hast du eine Idee?
 
Checkboxen werden nun mal nur übermittelt, wenn sie aktiviert sind.

Anderer Vorschlag(sieht erstmal aufwendiger aus, ist es aber nur, damit man es problemlos erweitern kann, falls man mal was anderes als TRs clonen will):
Code:
<html>
<head>
<title>Test</title>
<script type="text/javascript">
<!--

function clone()
{
    this.index=0;
    
    this.cloneTR=function()
    {   
        this.index++;
        this.objClone = this.table.rows[this.table.rows.length-1].cloneNode(true);
        this.childs=this.objClone.getElementsByTagName("*");
        
        for(i=0; i<this.childs.length; i++)
            {
                if(this.childs[i].tagName.match(/textarea|input|select/i))
                    {
                       if(this.childs[i].tagName=='INPUT' && this.childs[i].type=='text')
                            {
                                this.childs[i].removeAttribute('value');
                            }
                       this.childs[i].name=String(this.childs[i].name).replace(/\[\d*\]$/,'['+this.index+']');
                    }
            }
            
        this.table.getElementsByTagName("tbody")[0].appendChild(this.objClone)
        
  }
}


function init_cloning(obj,what)
{
    switch(what)
        {
            case 'TR':
                    var parent=obj;
                    while((parent.tagName!='table' || parent.id=='undefined') && parent.parentNode)
                        {
                            parent=parent.parentNode;
                            if(parent.tagName=='TABLE' && parent.id!='undefined')
                                {
                                
                                    eval(parent.id+'_clone=new clone()');
                                    eval(parent.id+'_clone.table=parent');
                                    obj.onclick=new Function('',parent.id+'_clone.clone'+what+'()');
                                    eval(parent.id+'_clone.clone'+what+'()');
                                    return;
                                }
                        }
                
        }
}

//-->
</script>
<style type="text/css">
<!--
*{font-family:Verdana,Geneva,Sans-Serif;}
-->
</style>
</head>
<body>
<pre style="height:200px;border:1px dotted #323232;background:#cfcfcf;overflow:scroll">$_POST=<?php
    print_r($_POST);
?>
</pre>
<center>
<form action='software_ok.php' method='POST'>
<table id='select_employee'>

  <tr>
    <th colspan="5"><input type="button"  onclick="init_cloning(this,'TR')" value="cloneTR()"></th>
  </tr>
  <tr>
    <th>Test</th>
    <th>Test1</th>
    <th width=10%>Test2</th>
    <th width=10%>Test3</th>    
    <th width=14%>Test4</th>
  </tr>
  <tr>
    <td><input class='input' type='text' size='50' name='test0[]' value='' /></td>
    <td><select name="test1[]"><option value="lala"> lala </option><option value="SOLOA"> SOLA </option></select></td>
    <td><input type="checkbox" name="test2[]" value="test2"></td>
    <td><input type="checkbox" name="test3[]" value="test3"> </td>
    <td><input type="checkbox" name="test4[]" value="test4"></td>
  </tr>
</table>
<input type="submit">
</form>
</center>
</body>
</html>

Beim Clonen werden dabei die Namen der Formularelemente geändert, aus test4[] wird test4[1](beim nächsten Clone-Vorgang test4[2]...usw.)...so kannst du alle übermittelten Werte eindeutig zuordnen.
 
Hallo

Habe den Code ausprobiert, wenn ich auf den Button klicke passiert überhaupt nichts.

Diese verdammten Checkboxen bringen mich noch zum durchdrehen!
 
Hallo

Hier haben wir ja behandelt wie man die letzte Zeile clonen kann.

Meine Frage ist nun, wie kann ich die letzte Zeile löschen? Es wird wohl irgendwie mit removechild(); gehen. Aber leider weiss ich nicht wirklich weiter.

Kann mir jemand weiterhelfen?

Danke und Gruss
MTH
 
Um Problemen mit dem IE aus dem Wege zu gehen, solltest du dafür deleteRow() verwenden:

Code:
if([tabelle].rows.length>0)[tabelle].deleteRow([tabelle].rows.length-1)
 
Um Problemen mit dem IE aus dem Wege zu gehen, solltest du dafür deleteRow() verwenden:

Code:
if([tabelle].rows.length>0)[tabelle].deleteRow([tabelle].rows.length-1)

Sorry, kann ich nicht ganz nachvollziehen.

Mein Code

Code:
function test(){
if(['tab_software'].rows.length>0)['tab_software'].deleteRow(['tab_software'].rows.length-1);


}

function cloneTR(){
  // Letzte Tabellenzeile clonen
  var objClone = document.getElementById("tab_software").rows[document.getElementById("tab_software").rows.length-1].cloneNode(true);

  // Inputinhalte löschen
    for(var i=0; i<objClone.getElementsByTagName("input").length; i++){
    objClone.getElementsByTagName("input")[i].value = "";
  }

  // Knoten einhängen
  document.getElementsByTagName("tbody")[3].appendChild(objClone);
}

Code:
<table id='tab_software'>
		<tr>
			<th width=10%>Name</th>
			<th width=10%>URL zum Download</th>
		</tr>
		<tr>
			<td><input class='input' type='text' maxlength="30" size='30' name='name[]' value='' /></td>
			<td><input class='input' type='text' maxlength="150" size='50' name='url[]' value='' /></td>
		</tr>
  	</table>	
		</div>

Code:
	<input type="button" class='button' value="weiteres Feld" onclick="cloneTR();"><input type="button" class='button' value="weiteres Feld" onclick="test();">
 
[tabelle] sollte in meinem Code als Platzhalter für den Zeiger auf die Tabelle als Objekt darstellen.

In deinem Fall müsstest du das [tabelle] durch getElementById('tab_software') ersetzen.
 

Neue Beiträge

Zurück