Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [JavaScript] Błąd z dynamicznym formularzem
Forum PHP.pl > Forum > Przedszkole
viamarimar
Chce zrobic dynamiczne pole formularza. Ogolnie wiem jak to zrobic i juz mi sie udalo jednak tworzac kolejne pola i klikajac dodaj nastepne, chailbym aby każde kolejne mi się podpisywalo pole1 pole2 pole3 itp
Aby wykonac tę czynnosc dodalem do mojego skryptu taki kod:

  1. i++;
  2. var tekst = document.createTextNode('pole '+i+': ');

jednak przez to caly kod przestal dzialac? o co tu chodzi? gdy to kasuje dziala normalnie? Wydaje mi sie iz powinno inkrementowac i wyswietlac kolejne nazyw dlaczego to sie nie dzieje?


Skrypt formularza i js:

  1. <div class="form-group">
  2. <label class="col-sm-3 control-label" for="cvv">Składniki(oddziel przecinkami):</label>
  3. <div id="pliki" class="col-sm-9">
  4. <textarea class="form-control skladniki" name="plik[]" placeholder="Message" rows="5"></textarea>
  5.  
  6. </div>
  7. </div>
  8. <div class="form-group">
  9. <input type="button" value="Załšcz kolejny plik" onclick="dodaj_element('pliki');" />
  10. </div>


  1. <script type="text/javascript">
  2. <!--
  3. function dodaj_element(kontener){
  4. i++;
  5. var tekst = document.createTextNode('pole '+i+': ');
  6. var znacznik = document.createElement('textarea');
  7. znacznik.setAttribute('type', 'text');
  8. znacznik.setAttribute('name', 'plik[]');
  9. znacznik.className = 'skladniki';
  10. var kontener = document.getElementById(kontener);
  11. kontener.appendChild(znacznik);
  12. }
  13. //-->
  14. </script>
Pyton_000
1. nie masz zadeklarowanej wartości i
2. i jest "zadejkarowane lokalnie w funkcji więc kolejne wywołania nie zwiększają i globalnie.

Zadeklaruj 'i' w przestrzeni globalnej (poza funkcją) i powinno zadziałać.

Poza tym sprawdzaj konsolę przeglądarki jaki błąd wywala.
viamarimar
-nie bardzo zmiana zmiennej na globalna nic nie zmienia
-ustalenie drugiej globalnej za wiele nie zmienia..
-konsola..hmm duzo bledow tam ale zwizaznych chyba nie tylko z tym a nie wszystkie umiem czytac

Poprawienie w ten sposob:

  1. <script type="text/javascript">
  2. <!--
  3.  
  4. function dodaj_element(kontener){
  5. var i;
  6. i++;
  7. var tekst = document.createTextNode('pole '+i+': ');
  8. document.body.appendChild(tekst);
  9. var znacznik = document.createElement('textarea');
  10. znacznik.setAttribute('type', 'text');
  11. znacznik.setAttribute('name', 'plik[]');
  12. znacznik.className = 'skladniki';
  13. var kontener = document.getElementById(kontener);
  14. kontener.appendChild(znacznik);
  15.  
  16. }
  17. //-->
  18. </script>


Teraz problem w tym ze pola sie dodaja , wyswietla sie pole Nan Pole Nan .. pod calym kodem strony a nie obok kolejnego stworzonego pola(fizycznie ze tak powiem) da sie to zmienic?
Comandeer
Teraz masz zmienną lokalną, nie globalną - więc tym bardziej nie działa. Poza tym inkrementować można tylko liczby, a nie undefined.

Co do wstawiania na końcu strony - wywal to document.body.appendChild i po wstawieniu samego pola użyj insertAfter, żeby wstawić tekst po nim
viamarimar
No ok, dodawanie mi działa. Próbowałem zrobić jeszcze usuwanie tworzonych pol i tez jest problem. Prawdopodobnie dlatego ze
"$(document).ready(function() {" w żaden spsob nie odnosi sie do zawartosci funkcji wiec elementy takie jak znacznik,kontener,pliki sa niewidoczne poza nia? Prosil bym o wskazowke jak zrobic usuwanie pol formularza

Do kazdego pola jest robiony $('<a href="#" class="delfield">usuń</a>').insertBefore(znacznik); jakby przycisk? chodz nie wiem czy to dobra metoda..

To wstawianie pomimo ze dziala tez moglby ktos ocenic czy jest ok?

  1. <script type="text/javascript">
  2. <!--
  3. var i = 1;
  4.  
  5. function dodaj_element(kontener){
  6. i++;
  7. var tekst = document.createTextNode(' Nr. '+i+' ');
  8. var znacznik = document.createElement('textarea');
  9.  
  10. znacznik.setAttribute('type', 'text');
  11. znacznik.setAttribute('name', 'plik[]');
  12. znacznik.setAttribute('placeholder', 'Wpisz nazwe składnika oraz jego wymaganą ilość... ');
  13.  
  14. znacznik.className = 'skladniki';
  15. var kontener = document.getElementById(kontener);
  16. kontener.appendChild(znacznik);
  17. $(tekst).insertBefore(znacznik);
  18. $('<a href="#" class="delfield">usuń</a>').insertBefore(znacznik);
  19. }
  20.  
  21.  
  22. $(document).ready(function() {
  23. $('a.delfield').live('click', function(){
  24. pliki.removeChild(znacznik);
  25. });
  26. }
  27. //-->
  28. </script>
Comandeer
Usunąć można element znajdujący się za linkiem (nextElementSibling AFAIR)
viamarimar
Mam jeszcze jeden mały problem nie umiem naprawić inkrementacji po usunięciu dynamicznego pola, mógłby mi ktoś z tym pomoc?

Na 100% problem lezy tutaj:
  1. function usun_element(x){
  2.  
  3. var x = document.getElementById("xxx").nextElementSibling.remove();
  4. var x = document.getElementById("xxx").remove();
  5. i--;
  6. }

i chyba trzeba zrobic cos w ten desen:
  1. x.parentNode.removeChild(document.getElementById('xxx'+(i--)));

ale powyzszy kod nie dziala ;/ jak to zmodyfikowac?

  1. <script type="text/javascript">
  2. <!--
  3. var i = 1;
  4.  
  5. function dodaj_element(){
  6. i++;
  7.  
  8. var child = document.createElement('input') ;
  9. var parent = document.getElementById('skladniki');
  10.  
  11. child.setAttribute('type', 'text');
  12. child.setAttribute('name', 'skladniki[]');
  13. child.setAttribute('id', 'xxx');
  14. child.setAttribute('placeholder', 'Wpisz nazwe składnika, podaj ilość i jednostkę miary.. ');
  15. child.className = 'form-control';
  16.  
  17.  
  18. parent.appendChild(child);
  19. $('<p class="marg2" >Składnik '+i+'</p>').insertBefore(child);
  20.  
  21.  
  22. }
  23.  
  24. function usun_element(x){
  25.  
  26. var x = document.getElementById("xxx").nextElementSibling.remove();
  27. var x = document.getElementById("xxx").remove();
  28. i--;
  29. }
  30.  
  31. //-->
  32. </script>
  33. <div class="form-group" id="s">
  34. <label class="col-sm-3 control-label">Składniki</label>
  35.  
  36. <div id="skladniki" class="col-sm-9"><p>Składnik 1</p>
  37. <input id="xxx" class="form-control" name="skladniki[]" placeholder="Wpisz nazwe składnika, podaj ilość i jednostkę miary.. " type="text">
  38. </div>
  39.  
  40. <div class="col-sm-12 ">
  41. <!-- <input type="button" name="insertfield" value="dodaj" /> -->
  42. <button type="button" class="btn btn-primary btn-xs pull-right marg2 pad" onclick="dodaj_element();" /> Dodaj składnik </button>
  43. <button type="button" class="btn btn-danger btn-xs pull-right marg2 pad " onclick="usun_element(this);" /> Usuń składnik </button>
  44. </div>
  45. </div>
  46.  
  47.  
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.