Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: dodawanie pól input
Forum PHP.pl > Forum > Po stronie przeglądarki > JavaScript
fokra
Sprawa jest taka, że nie znam JS, a potrzebuję formularza, który dodawałby pola typu 'file' do formularza nie kasując zapisanych wartości w poprzednich polach.. Konkretnie to chcę przesłać na serwer nieznaną wcześniej ilośc plików (np fotek) i po dodaniu każdego pliku chciałbym, żeby istniała możliwość bądź wysłania tego co jest bądź dołożenia kolejnego pliku (dopisania do formularza kolejnego pola input typu file).
gekon
Ja bym to zrobił mniej więcej tak:
Kod
addFileInput = function(parentElement){
var inputName = prompt('Atrybut name dla kolejnego inputa', ' ');
var fileInput = document.createElement("input");
fileInput.type = "file";
fileInput.name = inputName;
fileInput.value = '';
parentElement.appendChild(fileInput,parentElement.firstChild);
}

window.onload=function(){
var insert = document.getElementById('addFileInput');
if(insert){
  insert.onclick = function(){
   addFileInput(insert.parentNode);
  }
}
else { return false; }
}

  1. <form id="fileForm" action="plik.php" method="get">
  2. <input type="button" id="addFileInput" value="dodaj pole pliku">
  3. <input type="submit" value="wyslij">
  4. <input type="file" name="imie" >
  5. </form>
fokra
Dzięki smile.gif działa świetnie.. ale tylko pod IE sad.gif
Niastety mam (i większość moich znajomków) mozillkę 1.7.2... a tu już sprawa wygląda gorzej.. po kliknięciu buttona 'dodaj plik' nie wskakuje nowe pole input..
Mam jednak coś co działa tylko.. sorki ale proszę mi wybaczyć zupełną zieloność nie wiem gdzie wstawić znacznik nowej lini żeby to jakoś wyglądało na stronce (no żeby nowy input wyskakiwał w nowym wierszu a nie obok poprzedniego.. No i czy to się da jakoś przerobić na zbilżony do pospolitego formularza (gdzie mogę określić metodę i skrypt docelowy php)w części kodu html?
oto kody JS i html
Kod
var countInputs = 0;
function addInput(id)
{

var oDiv = document.getElementById(id);
var inputElement = document.createElement("input");
inputElement.setAttribute("name","userfile_"+countInputs);
inputElement.setAttribute("type","file");
oDiv.appendChild(inputElement);
countInputs++;
}


  1. <div id="inputLayer"></div>
  2. <a href="javascript:addInput('inputLayer')">Dodaj plik</a>
TomASS
Zademonstruje Ci na przykładzie selecta:
Kod
function $(id){
return document.getElementById(id);
}

function make_select(div){
    var select = document.createElement("select");
    select.name = "przeladunek_z["+numer+"][]";    
    var br = document.createElement("br");
    $(div).appendChild(br);                           //o cała tajemnica <Br>
    $(div).appendChild(select);    
}


  1. <form method="post" action="plik.php">
  2. <div id="inputLayer"></div>
  3. <a href="make_select('inputLayer');">Dodaj plik</a>
  4. </form>
gekon
Zamieniłbym jednak diva na fieldset.

A co do mojego przykładu, wystarczy usunąć linijkę:
Kod
fileInput.value = '';

i stara Mozilla powinna też łykać.
fokra
dzięki serdeczne smile.gif
ale niestety ten nie działa wogóle (mimo poprawienia błędu w linku do funkcji) ani w mozillce ani w IE sad.gif
cóż mimo wszystko dzięki.. już mam 3 różniste przykłady rozwiązania to może w końcu pojmę jak to-to (javascript) działa winksmiley.jpg
w każdym razie Dzięki ( również za to że nie dostałem tu wiązanki określającej precyzyjnie poziom mojej tępoty w zakresie JS.. winksmiley.jpg )
fokra
witam wyjadaczy smile.gif

ktoś może wie dlaczego to mi działa w mozilli a w IE nie che??

Kod
<script type="text/javascript">
function addInput(id)
{
var countInputs = 0;
var Div = document.getElementById(id);
var inputElement = document.createElement("input");
var br = document.createElement("br");
inputElement.setAttribute("name","userfile_"+countInputs);
inputElement.setAttribute("type","file");
Div.appendChild(inputElement);
Div.appendChild(br);
countInputs++;
}
</script>


i

  1. <form method="post" action="plik.php" enctype= "multiple">
  2. <div id="inputLayer"></div>
  3. <br>
  4. <a style=text-decoration:none href="javascript:addInput('inputLayer')"><button>dodaj</button></a>
  5. <input type="submit" value="wyslij">
mike
Coś mi się widzi że o HTMLu słyszałeś tylko z daleka i niewyraźnie tongue.gif
  1. <script type="text/javascript">
  2. function addInput(id)
  3. {
  4.    var countInputs = 0;
  5.    var Div = document.getElementById(id);
  6.    var inputElement = document.createElement("input");
  7.    var br = document.createElement("br");
  8.    inputElement.setAttribute("name","userfile_"+countInputs);
  9.    inputElement.setAttribute("type","file");
  10.    Div.appendChild(inputElement);
  11.    Div.appendChild(br);
  12.    countInputs++;
  13. }
  14.  
  15. <form method="post" action="plik.php" enctype="multipart/form-data">
  16.  <div id="inputLayer"></div>
  17.  <br>
  18.  <input type="button" onclick="addInput('inputLayer'); return false;" value="dodaj" />
  19.  <input type="submit" value="wyslij" />
  20. </form>
yasiek
A jak dorzucić do tego kodu funkcję odwrotną - po kliknięciu znikają kolejne pola, które wcześniej się dodało? a gdybym chciał na przykład oprócz file dodać jeszcze select z ustalonymi wartościami do wyboru...?
wowerson
Cytat(mike_mech @ 7.04.2006, 22:37:14 ) *
Coś mi się widzi że o HTMLu słyszałeś tylko z daleka i niewyraźnie tongue.gif
  1. <script type="text/javascript">
  2. function addInput(id)
  3. {
  4.    var countInputs = 0;
  5.    var Div = document.getElementById(id);
  6.    var inputElement = document.createElement("input");
  7.    var br = document.createElement("br");
  8.    inputElement.setAttribute("name","userfile_"+countInputs);
  9.    inputElement.setAttribute("type","file");
  10.    Div.appendChild(inputElement);
  11.    Div.appendChild(br);
  12.    countInputs++;
  13. }
  14.  
  15. <form method="post" action="plik.php" enctype="multipart/form-data">
  16.  <div id="inputLayer"></div>
  17.  <br>
  18.  <input type="button" onclick="addInput('inputLayer'); return false;" value="dodaj" />
  19.  <input type="submit" value="wyslij" />
  20. </form>


Teraz take pytanko..jak przeiterować przez tak utworzoną tablicę w PHPie?
kryspi
Ja sie przylacze do tematu pozwole sobie zapytac sie w jaki sposob dobrac sie do wartosci tych pola dynamicznie dodawanych, zeby np je walidowac. Mam pola dodawane tak jak na ponizszym przykladzie ale nie wiem w jaki sposob przy pomocy JavaScriptu odczytac kolejne wartosci z powstalej tablicy:

  1. <?php
  2. var div = document.createElement('div');
  3. var data_wyjazdu = document.createElement('input');
  4. data_wyjazdu.setAttribute('type', 'text');
  5. data_wyjazdu.setAttribute('name', 'data_wyjazdu[]');
  6. data_wyjazdu.setAttribute('value', '0000-00-00');
  7. div.appendChild(data_wyjazdu);
  8. ?>
gekon
@yasiek: dodawać id dla kazdego inputa i usuwac element odwolujac się do rodzica, np.:
  1. function deleteMe(handler){
  2. handler.onclick = function{
  3. this.parentNode.removeChild(this);
  4. }
  5. }

@wowerson: Można zmienić name na userfile[+countInputs+], wtedy jest regularna tablica.
@kryspi: getElementsByTagName('input')
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.