Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [jQuery] dodawanie inputów
Forum PHP.pl > Forum > Po stronie przeglądarki
colachips
Witam,

tworzę sobie skrypt ankiet, gdzie ankieta moze miec n pytań, każde pytanie zaś n odpowiedzi. Muszę jakoś dane pytanie i odpowiedzi do niego zgrupować, więc wpadłem na pomysł aby skorzystać z tablic. Tak to wygląda:

  1. <dl>
  2. <h2>Dodaj pytania</h2>
  3.  
  4. <dt><label for="questions[0][q]">Pytanie 1</label></dt>
  5. <dd><input type="text" name="questions[0][q]" id="questions[0][q]"></dd>
  6.  
  7. <dt><label for="questions[0][a][0]">Odpowiedź 1</label></dt>
  8. <dd><input type="text" name="questions[0][a][0]" id="questions[0][a][0]"></dd>
  9.  
  10. <dt><label for="questions[0][a][1]">Odpowiedź 2</label></dt>
  11. <dd><input type="text" name="questions[0][a][1]" id="questions[0][a][1]"></dd>
  12.  
  13. <a href="#" class="link_add_answer">Dodaj kolejną odpowiedź</a><br />
  14. <a href="#" class="link_add_question">Dodaj następne pytanie</a>
  15. </dl>


Chciałbym, korzystając z jQuery aby można było dodawać kolejne pytania i odpowiedzi. Moim celem jest stworzenie takiego kodu, który doda pytanie w takiej formie:

  1. ...
  2. <dt><label for="questions[1][q]">Pytanie 2</label></dt>
  3. <dd><input type="text" name="questions[1][q]" id="questions[1][q]"></dd>
  4.  
  5. <dt><label for="questions[1][a][0]">Odpowiedź 1</label></dt>
  6. <dd><input type="text" name="questions[1][a][0]" id="questions[1][a][0]"></dd>
  7.  
  8. <dt><label for="questions[1][a][1]">Odpowiedź 2</label></dt>
  9. <dd><input type="text" name="questions[1][a][1]" id="questions[1][a][1]"></dd>
  10.  
  11. <dt><label for="questions[1][a][2]">Odpowiedź 3</label></dt>
  12. <dd><input type="text" name="questions[1][a][2]" id="questions[1][a][2]"></dd>
  13.  
  14. <a href="#" class="link_add_answer">Dodaj kolejną odpowiedź</a><br />
  15. <a href="#" class="link_add_question">Dodaj następne pytanie</a>


Nie proszę o gotowca, chciałbym się czegoś nauczyć, dlatego jeśli ktoś może wskazać przynajmniej kierunek, w którym powinienem podążać, to będę wdzięczny. Mogę ewentualnie zapłacić, jesli ktoś ma coś gotowego smile.gif

Pozdr.
kamil4u
A czego nie możesz zrobić? Której części swojego algorytmu nie umiesz zrealizować.

Jeśli problem sprawia Ci dodawanie elementów to: http://ferrante.pl/frontend/javascript/jquery-to-latwe-4/

Słowa kluczowe, które mogą być pomoce:
DOM - dodawanie/edycja elementów
zdarzenia - wszelkie klikanie myszką lub klawiaturą
lukasz1985
Może łatwiej byłoby gdybyś spróbował podejścia obiektowego.
Na przykład tworząc odmienne klasy dla ankiety, pytania i odpowiedzi

Wyglądałoby to mniej więcej tak, że klasa ankiety przetrzymywałaby węzeł DOM z kontenerem pytań, klasa pytań przetrzymywałaby węzeł DOM z kontenerem odpowiedzi.
Klasa ankiety miałaby metody dodające i usuwające pytanie.

Klasa odpowiedzi natomiast przetrzymywałaby węzeł z odpowiedzią.

Wtedy miałbyś ładną strukturę kodu:

Klasa "Ankieta" - właściwości, np:
- liczba pytań
- pytania (tablica z "Pytanie")
metody, np:
- dodaj pytanie
- usuń pytanie

Klasa "Pytanie" - właściwości, np:

- numer pytania
- treść pytania
- odpowiedzi (instancje "Odpowiedź")

Klasa "Pytanie" - metody np:
- zmien tresc pytania
- przenies pytanie wyzej
- przenies pytanie nizej

Klasa "Odpowiedź":
- analogicznie jak do pytania

colachips
@kamil4u: proste dodawanie elementów umiem. Chodzi mi o bardziej kompleksowe podejście do problemu. Takie jak przedstawił @lukasz1985
@lukasz1985: bardzo mi się podoba taki pomysł. Gdzie zacząć żeby to ugryźć. Możecie coś polecić?

Dzięki

EDIT:

Jakoś sobie poradziłem. Uważam, że brzydko to rozwiązałem, ale na potrzeby chwili powinno wystarczyć.
Mam natomiast problem z czymś takim. Mam kod:
  1. <dl class="question">
  2.  
  3. <dt><label for="questions[0][q]">Pytanie 1</label></dt>
  4. <dd><input type="text" name="questions[0][q]" id="questions[0][q]"></dd>
  5.  
  6. <dt><label for="questions[0][a][0]">Odpowiedź 1</label></dt>
  7. <dd><input type="text" name="questions[0][a][0]" id="questions[0][a][0]"></dd>
  8.  
  9. <dt><label for="questions[0][a][1]">Odpowiedź 2</label></dt>
  10. <dd><input type="text" name="questions[0][a][1]" id="questions[0][a][1]"></dd>
  11.  
  12. <!-- tutaj chcę dodać kolejne pytanie -->
  13.  
  14. <dt><a href="#" class="link_add_answer">Dodaj kolejną odpowiedź</a></dt>
  15.  
  16. </dl>


I chcę dodać kolejne pytanie w miejscu komentarza. Próbowałem tak:
  1. $('.link_add_answer').click(function(){
  2. $(this).parents('dl.question').append(
  3. '<p>aaa</p>'
  4. );
  5. return false;
  6. });


To działa, ale tylko dla pierwszego <dl class="question">. Jak dodam kolejne pytania to w tamtych już nie działa (nic się nie dzieje po kliknięciu "Dodaj kolejną odpowiedź". Jak zatem znaleźć pierwsze "dl.question" (parent) dla klikniętego "link_add_answer"?
lukasz1985
Napisałem conieco na ten temat, może Cię to zainteresuje:



[JAVASCRIPT] pobierz, plaintext
  1. /*
  2.  
  3. Ze swojego doświadczenia myślę, że najlepiej byłoby gdybyś znalazł jakąś bibliotekę do tworzenia klas w JS która Ci najlepiej odpowiada. Ja używam tej dołączonej do prototype.js, ponieważ jest zwięzła i prosta.
  4.  
  5.  
  6. Jako, że trudno napisać gotowiec :) , mogę Ci podać tylko pewne schematy myślenia.
  7.  
  8. Ważne, żebyś wyobraził sobie wszystko co chcesz otrzymać i rozbił temat, nieco abstrakcyjny na drobniejsze elementy.
  9.  
  10. Idąc tokiem myślenia z mojego poprzedniego postu:
  11.  
  12. Spróbuj zrobić tak, żeby w momencie konkretyzacji klasy kreatora ankiety konieczne
  13. było tylko podanie elementu w którym pomieści się cały interfejs użytkownika i
  14. wszystkie elementy z których będzie on zbudowany:
  15.  
  16. var kreatorAnkiety = new KreatorAnkiety("id_diva_z_kreatorem")
  17.  
  18. Skoro chcesz utworzyć "kreator ankiet" możesz zacząć od stworzenia konstruktora kreatora ankiety:
  19.  
  20. W konstruktorze możesz utworzyć wszystkie pola klasy, które będą potrzebne do jego działania czyli:
  21. - pole z przyciskiem dodawania pytania (który będzie węzłem DOM) z przypisanym zdarzeniem, np "dodajPytanieButton"
  22. - pole z ilością pytań, które w danej chwili są w kreatorze (między innymi po to aby wiedzieć jaki
  23. numer będzie miało następne pytanie.
  24.  
  25.  
  26.  
  27. na przykład:
  28. */
  29.  
  30. /*
  31.  * Klasa kreatora ankiety. Na stronie może znajdować się więcej takich kreatorów.
  32.  *
  33.  */
  34.  
  35. var KreatorAnkiety = Class.create({
  36. initialize: function (selektorElementu) {
  37. /*
  38.   * Węzeł DOM w którym będą się znajdować pytania
  39.   */
  40. this.$kontenerKreatora = $("<div>")
  41.  
  42. /*
  43.   * Pole z tablicą, która przetrzymuje obiekty klasy Pytanie
  44.   */
  45. this.pytania = [];
  46.  
  47. /*
  48.   * Wrzucanie kontenera do węzła o selektorze podanym w konstruktorze
  49.   */
  50. $(selektorElementu).append(this.$kontenerKreatora);
  51.  
  52. /*
  53.   * Utworzenie i dodanie do kontenera - przycisku odpowiedzialnego za
  54.   * dodawanie pytań w kreatorze
  55.   */
  56. this.$buttonDodajPytanie = $("<input type='button' value='Dodaj pytanie'>");
  57. this.$kontenerKreatora.append(this.$buttonDodajPytanie)
  58.  
  59. /*
  60.   * Ilość pytań, jako że jesteśmy w konstruktorze to przypisujemy tej właściwości
  61.   * (lub polu - słów "właściwość" i "pole" używam zamiennie) wartość zerową
  62.   */
  63. this.iloscPytan = 0;
  64.  
  65. /*
  66.   * Uruchomienie przycisku z dodawaniem pytań
  67.   */
  68. this.uruchomDodawaniePytan();
  69. },
  70.  
  71. uruchomDodawaniePytan: function () {
  72. /*
  73.   * Przy kliknięciu w button dodający pytanie wykonuje się funkcja dodajPytanie
  74.   */
  75. this.$buttonDodajPytanie.click(this.dodajPytanie.bind(this))
  76. },
  77.  
  78.  
  79. dodajPytanie: function () {
  80. /*
  81.   * Dodaj 1 do ilości pytań w tym kreatorze ankiety,
  82.   * dla jasności przypisz tę wartość do zmiennej kolejnePytanie
  83.   */
  84. this.iloscPytan += 1;
  85. var kolejnePytanie = this.iloscPytan;
  86. /*
  87.   * Dialog pytający o treść pytania i umożliwiający wpisanie jego treści
  88.   */
  89. var tresc = prompt("Prosze podać treść pytania");
  90.  
  91. /*
  92.   * Sedno funkcji dodajPytanie - utworzenie nowej instancji (konkretyzacja) klasy
  93.   * Pytanie.
  94.   * Obiekt nowePytanie zostaje skonstruowany z trzema parametrami:
  95.   * 1. this - ten kreator ankiety, obiekt typu Pytanie musi wiedzieć do którego
  96.   * kreatora ankiety należy
  97.   * 2. kolejnePytanie - czyli numer właśnie tworzonego pytania
  98.   * 3. tresc - mówi samo za siebie
  99.   */
  100. var nowePytanie = new Pytanie(this, kolejnePytanie, tresc)
  101.  
  102.  
  103. /*
  104.   * Wyswietlenie pytania
  105.   */
  106. nowePytanie.wyswietl();
  107.  
  108. this.pytania.push(nowePytanie);
  109.  
  110. this.przenumeruj();
  111.  
  112. },
  113.  
  114. usunPytanie: function (pytanie) {
  115. /*
  116.   * Odwrotność tego co dzieje się przy dodawaniu pytania. Tutaj
  117.   * przesyłany jest obiekt klasy Pytanie (w argumencie "pytanie")
  118.   */
  119. this.iloscPytan -=1;
  120.  
  121. /*
  122.   * Poszukiwanie pytania które ma być usunięte z kreatora
  123.   */
  124. var indexPytania = this.pytania.indexOf(pytanie);
  125.  
  126. /*
  127.   * Usunięcie podanego pytania z tablicy pytań tego kreatora ankiety
  128.   */
  129. this.pytania.splice(indexPytania,1);
  130.  
  131. this.przenumeruj();
  132.  
  133. },
  134.  
  135. przenumeruj: function () {
  136. // Tutaj kod przenumerujący pytania tak aby miały prawidłowe numery.
  137. // Do napisania we własnym zakresie :)
  138. },
  139.  
  140. pobierzKontenerKreatora: function () {
  141. return this.$kontenerKreatora;
  142. }
  143.  
  144.  
  145. })
  146.  
  147. var Pytanie = Class.create({
  148. initialize: function (kreatorAnkiety, numer, tresc) {
  149. /*
  150.   * Kreator ankiety, w którym znajduje się pytanie,
  151.   */
  152. this.kreatorAnkiety = kreatorAnkiety
  153.  
  154. this.utworzElementy();
  155. this.uruchomUsuwanie();
  156.  
  157. /*
  158.   * Przekazanie wykonania konstruktora do metod
  159.   */
  160. this.ustawNumer(numer);
  161. this.ustawTresc(tresc)
  162. },
  163.  
  164. utworzElementy: function () {
  165. this.$kontenerPytania = $("<div></div>");
  166. this.$numer = $("<span></span>");
  167. this.$tresc = $("<span></span>");
  168. this.$buttonUsunPytanie = $("<button type='button' value='Usun to pytanie'>")
  169.  
  170. this.$kontenerPytania.append(this.$numer);
  171. this.$kontenerPytania.append(this.$tresc);
  172. this.$kontenerPytania.append(this.$buttonUsunPytanie);
  173. },
  174.  
  175. uruchomUsuwanie: function () {
  176. this.$buttonUsunPytanie.click(this.usun.bind(this));
  177. },
  178.  
  179. wyswietl: function () {
  180. var $kontenerKreatora = this.kreatorAnkiety.pobierzKontenerKreatora();
  181. $kontenerKreatora.append(this.$kontenerPytania);
  182. },
  183.  
  184.  
  185.  
  186.  
  187. ustawNumer: function (numer) {
  188. this.$numer.html(numer + ".")
  189. },
  190.  
  191.  
  192. ustawTresc: function (tresc) {
  193. this.$tresc.html(tresc + ".")
  194. },
  195.  
  196. usun: function () {
  197. /*
  198.   * Pytanie musi się usunąć z kreatora ankiety
  199.   */
  200. this.kreatorAnkiety.usunPytanie(this);
  201. this.$kontenerPytania.remove();
  202.  
  203. }
  204. })
  205.  
  206.  
  207. /*
  208. Zauważ że to tylko fragment całości i do klasy KreatorAnkiety trzeba jeszcze dopisać
  209. metodę "przenumeruj".
  210. W chwili obecnej dodając dwa pytania i usuwając pytanie numer 1. Po ponownym dodaniu
  211. pytania - powstają dwa pytania o numerze '2'.
  212. Dlatego wewnątrz klasy KreatorAnkiety znajduje się pole "pytania", które
  213. jest tablicą pytań. Dzięki tej tablicy będziesz w stanie przenumerować pytania po
  214. dodaniu lub usunięciu pytania.
  215.  
  216.  
  217.  
  218.  */
[JAVASCRIPT] pobierz, plaintext



A tu dokument HTML:

  1. <!DOCTYPE html>
  2. <head>
  3. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  4.  
  5. <script src="js/blbilioteki/class.js" type="text/javascript"></script>
  6. <script src="js/blbilioteki/jquery.js" type="text/javascript"></script>
  7. <script src="kreator_ankiet.js" type="text/javascript"></script>
  8.  
  9. </head>
  10. <body>
  11.  
  12.  
  13. <div>TODO write content</div>
  14. <div id="kreator"></div>
  15.  
  16.  
  17.  
  18. <script type="text/javascript">
  19. new KreatorAnkiety("#kreator")
  20.  
  21. </script>
  22. </body>
  23. </html>
  24.  

toaspzoo
jquery -> .append()
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.