Dynamisch file/upload Felder erstellen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Dynamisch file/upload Felder erstellen

    Hi zusammen,
    hab ein "noob" Problem, hab aber in der Suche keine Lösung gefunden.
    Versuche grad je nachdem wie viele Uploads der Benutzer braucht, dementsprechend Upload Felder zu erstellen.
    Mein Ansatz:

    Quellcode

    1. <td>
    2. <html><head>
    3. <script type="text/Javascript">
    4. <!--
    5. function addField() {
    6. document.getElementById("fields").innerHTML += "<input type="file" value="" id="test" >";
    7. }
    8. //-->
    9. </script>
    10. </head>
    11. <body>
    12. <p>Anzahl der Seiten</p>
    13. <input value="1" onChange="addfield()" id="Anzahl" >
    14. <div id="fields" ></div>
    15. </body>
    Alles anzeigen

    ist jetzt noch keine for Schleife und so drin, aber scheiter ja auch schon an der Grundlage^^.
    wär für den ein oder anderen Tip sehr dankbar!
  • noch ein kleines Problem mit dem entfernen eines Feldes...

    Quellcode

    1. function addField() {
    2. Anzahl = document.getElementById('Anzahl').value;
    3. document.getElementById("fields").innerHTML = "";
    4. var i = 1;
    5. Anzahl++;
    6. for (i,Anzahl;i<Anzahl;i++){
    7. document.getElementById("fields").innerHTML += "<tr><input type=\"file\" value=\"\" name=\"Feld\" ></tr>";
    8. }
    9. }
    10. function plusEins() {
    11. document.getElementById("fields").innerHTML += "<tr><input type=\"file\" value=\"\" name=\"Feld\" ></tr>";
    12. }
    13. function minusEins() {
    14. ????
    15. }
    Alles anzeigen

    Habs mit verschieden Versionen mit pop() versucht aber hat noicht funktioniert
    Die Dateifelder sind ja alle getElementsByName("Feld")[sounsovieltes], dacht mir mit pop kann ich das letzte einfach löschen...
    Aber kann da irgendwie nicht drauf zugreifen auch nicht mit .length und dann das letzte einfach .innerHTML="";
    jmd ne idee?
  • pop() ist eine Array Funktion. Mit innerHTML += "String" kaskadierst du jedoch nur den Inhalt eines Elements.

    Mit getElementsByTagName() kannst du dir die <tr>s jedoch wieder in ein Array laden und dann mit removeChild wieder entfernen.
    * http://de.selfhtml.org/javascript/objekte/node.htm#remove_child
    * http://de.selfhtml.org/javascript/objekte/document.htm#get_elements_by_tag_name

    Oder aber du vergibst den Zeilen eigene IDs - dann kannst du sie direkt ansprechen.
  • Jo mit eigener Id wollte ich es auch versuchen, aber irgendwie ging das nicht...
    So hatte ich es versucht:

    Quellcode

    1. function addField() {
    2. id = document.getElementById('Anzahl').value;
    3. document.getElementById("fields").innerHTML = "";
    4. var i = 1;
    5. id++;
    6. for (i,id;i<id;i++){
    7. var name2= "Feld"+i;
    8. alert(name2);
    9. document.getElementById("fields").innerHTML += "<tr><input value=\"\" name=name2 id=name2 ></tr>";
    10. }
    11. document.getElementById("Feld3").value="test";
    12. document.getElementsByName("Feld3").value="test";
    13. }
    Alles anzeigen
  • Zum Syntaxfehler:
    Da das oben so wunderbar funktioniert hat, mach ichs wieder mit einem Beispiel

    Quellcode

    1. var x = "Text"+Variable+"Text";


    Dennoch war deine letzte Lösung besser. Wenn du mit den IDs arbeiten willst, brauchst du einen globalen Zähler, der außerhalb der Methode deklariert ist. Das mit dem leeren und neu Befüllen mit for-Schleifen hat keinen Sinn.
  • Jo hatte alles super geklappt auch mit dem removeChild bis ich auf eine absolut seltsame Sache gestoßen bin!
    Javascript behauptet nämlich standhaft, dass z.B 9 > 10 ist während er aber richtig erkennt dass 11 > 10 ist und 8 < 9! aber sobald es zweistellig wird passiert da irgendetwas komisches. Da muss irgendwas mit einer kommastelle oder so sein, dass er statt 25 2,5 liest. Weil 25 größer als 2 ist, aber 25 < als 3 sein soll...
    Hab aber schon alles ausprobiert mit int, parseint usw ohne Erfolg... Da muss irgendwas grundlegendes falsch sein
    Meine Option Box

    Quellcode

    1. .
    2. .
    3. .
    4. <option value="9">9</option>
    5. <option value="10">10</option>
    6. .
    7. .
    8. .


    und so wird das ausgelesen:

    Quellcode

    1. a = document.getElementById('OptionBox(AktuellerWert)').value;
    2. o = document.getElementById('VorherigerWert').value;
    3. if (a<o) {
    4. alert(a+"ist kleiner "+o);
    5. document.getElementById('VorherigerWert').value=a;
    6. }
    7. if (a>o) {
    8. alert (a+" ist bigger als "+o);
    9. document.getElementById('VorherigerWert').value=a;
    10. }
    Alles anzeigen

    wie gesagt hab da schon verschiedene Möglichkeiten a und o auszulesen angewandt als int, zuerst string dann int usw... auch hab ich alles erstmal mal 10 und dann anschließend wieder durch 10 geteilt, aber dann ist halt 100<90 das Problem bleibt
    auch wenn ich statt 9 9.0 mach :?
  • Ich würde runde Klammern nicht unbedingt in einem Formularelement verwenden. Keine Ahnung ob das funktioniert.
    Die Ausgaben mit "ist kleiner" bzw. "ist bigger" erhältst du aber, oder?

    Noch eine weitere Methode:
    Zum parsen, kannst du auch einfach eval'n (nicht unbedingt die sauberste Möglichkeit)

    Quellcode

    1. a = eval(document.getElementById('...').value);
  • So fertig und funktioniert wunderbar Testweise noch mit normalen Inputfeldern statt file fields!
    Eine kleine Sache ist noch und zwar in der Funktion Plus() wie bekomme ich denn da um das neue inputfeld noch ein <tr>...</tr> rum?

    Quellcode

    1. <html><head>
    2. <script type="text/Javascript">
    3. <!--
    4. function addField() {
    5. Anzahl = document.getElementById('Anzahl').value;
    6. Anzahl_old = document.getElementById('hidden').value;
    7. if (Anzahl_old == "0") { //Erster Durchlauf (noch mit innerHTML)
    8. for (i=1;i<=Anzahl;i++){
    9. var name2= "products_attributes_filename"+i;
    10. document.getElementById("fields").innerHTML += "<tr><input value="+i+" name="+name2+" id="+name2+" ></tr>";
    11. }
    12. document.getElementById('hidden').value = Anzahl;
    13. }
    14. else {
    15. updateField(); //ab dem 2ten Durchlauf
    16. }
    17. }
    18. function updateField(){
    19. a = eval(document.getElementById('Anzahl').value);
    20. o = eval(document.getElementById('hidden').value);
    21. if (a<o) { //Neue Zahl der File Fields ist kleiner als die Alte -> es muessen welche gel&ouml;scht werden!
    22. for (i=o;i>a;i--){
    23. minus(i);
    24. }
    25. document.getElementById('hidden').value=a;
    26. }
    27. if (a>o) { //Neue Zahl der File Fields ist groesser als die Alte -> es muessen welche angef&uuml;gt werden!
    28. for(i=o;i<a;i++){
    29. plus();
    30. }
    31. }
    32. }
    33. function plus() { //eine <input dazu
    34. Anzahl = document.getElementById('hidden').value;
    35. Anzahl++;
    36. var name2= "products_attributes_filename"+Anzahl;
    37. var newInput = document.createElement("input");
    38. Erstellt = document.getElementById("fields").appendChild(newInput);
    39. Erstellt.setAttribute("id", name2, 0);
    40. Erstellt.setAttribute("value", Anzahl, 0);
    41. //Erstellt.setAttribute("type", "file", 0);
    42. document.getElementById('Anzahl').value= Anzahl;
    43. document.getElementById('hidden').value= Anzahl;
    44. }
    45. function minus() { //eine <input weniger
    46. Anzahl = eval(document.getElementById('hidden').value);
    47. if (Anzahl > 1 ) {
    48. de = document.getElementById('fields').lastChild;
    49. var Felder = document.getElementById("fields");
    50. Felder.removeChild(de);
    51. Anzahl--;
    52. document.getElementById('Anzahl').value = Anzahl;
    53. document.getElementById('hidden').value = Anzahl;
    54. }
    55. }
    56. //-->
    57. </script>
    58. </head>
    59. <body>
    60. <td>
    61. <p id="Dateien">Anzahl der Seiten</p>
    62. <input type="button" onClick="plus()" value="+">
    63. <input type="button" onClick="minus()" value="-">
    64. </td>
    65. <td>
    66. <select name="Anzahl" size="1" onChange="addField()" id="Anzahl">
    67. <option value="1">1</option>
    68. <option value="2">2</option>
    69. <option value="3">3</option>
    70. <option value="4">4</option>
    71. <option value="5">5</option>
    72. <option value="6">6</option>
    73. <option value="7">7</option>
    74. <option value="8">8</option>
    75. <option value="9">9</option>
    76. <option value="10">10</option>
    77. <option value="11">11</option>
    78. <option value="12">12</option>
    79. <option value="13">13</option>
    80. <option value="14">14</option>
    81. <option value="15">15</option>
    82. </select>
    83. <div id="fields" ></div>
    84. <td>
    85. <input id="hidden" value="0" type="hidden">
    86. </td>
    87. </td>
    88. </body>
    Alles anzeigen