Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [JavaScript]Dodawanie kolejnych textboxów po kliknięciu na button
danon198901
post 23.03.2013, 20:17:47
Post #1





Grupa: Zarejestrowani
Postów: 35
Pomógł: 0
Dołączył: 26.09.2012

Ostrzeżenie: (0%)
-----


Witam,

z javascript miałem bardzo mało do czynienia (głównie PHP), ale uczę się na bieżąco robiąc własne projekty. W chwili obecnej mam ciężki orzech do rozgryzienia. Chciałbym dodać opcję, że po kliknięciu użytkownikowi pojawiają się 2 nowe textboxy obrazujące współrzędne 'x' oraz 'y'.

A więc jest sobie na stronce button po kliknięciu na który textboxy mają być dodawane i kolejno otrzymywać inne name oraz id (np.: x1,x2,y1,y2 itd) ze względu na dalszą obsługę przez interpreter php. Czyli pierwsze kliknięcie = jeden textbox X oraz Y. Dziesięć kliknięć na button = 10x textbox X oraz 10x textbox Y.

Z wcześniejszego tematu na forum dowiedziałem się mniej więcej jak dodawać przez JS elementy HTML - jednak nadal nie do końca to "kminię".

Przykładowy kod dodający buttona, wyszperany w sieci:
  1. <button onclick="myFunction()">Try it</button>
  2.  
  3.  
  4. function myFunction()
  5. {
  6. var btn=document.createElement("BUTTON");
  7. var t=document.createTextNode("CLICK ME");
  8. btn.appendChild(t);
  9. document.body.appendChild(btn);
  10. };
  11.  


Mi chodzi dokładnie o coś takiego, z tym, że chcę, aby kolejne textboxy otrzymywały inne 'name' oraz 'id'. Może ktoś zna jakiś ciekawy tutorial odnośnie tego zagadnienia, bo ja się w google naszperałem, a w kursach online po prostu tego brakuje.

Go to the top of the page
+Quote Post
PrinceOfPersia
post 23.03.2013, 21:31:06
Post #2





Grupa: Zarejestrowani
Postów: 717
Pomógł: 120
Dołączył: 18.04.2009

Ostrzeżenie: (0%)
-----


Jak ma wyglądać ta strona (wrzuć jakiś link, albo choćby projekt w *.jpg)

Cytat
2 nowe textboxy obrazujące współrzędne 'x' oraz 'y'.

textbox to znaczy co dokładnie? Ten kod, który podałeś powinien utworzyć przyciski HTML. (ale to tylko kwestia odpowiedniego tagu, w tym kodzie masz <button>. Może chodziło ci o <input type="text" /> ?)

Cytat
kolejno otrzymywać inne name oraz id

id podmieniasz np. tak:
Kod
var btn=document.createElement("BUTTON");
btn.id = "przycisk-1";


name chyba też (ale nie jestem pewien):
Kod
btn.name = "przycisk-1";


żeby zmienić współrzędne przycisku dany element musi mieć CSS position:absolute (albo inne, chodzi o to żeby nie było statyczne), a potem w JS:
Kod
var x = 120; // wspolrzedne przycisku
var y = 250;
btn.style.left = x + "px";
btn.style.top = y + "px";


albo w jQuery, mniej pisania, ale na to samo wychodzi (jQuery po prostu oszczędza klawiaturę, ale nie zwalnia z obowiązku wiedzy o tym, jak działa CSS czy DOM).

PS.
żeby w id były współrzędne:
btn.id = "przycisk-" + x + "-" + y;

np. "przycisk-100-200" (x, y powinny być liczbami całkowitymi).


Ten post edytował PrinceOfPersia 23.03.2013, 21:33:36


--------------------
Go to the top of the page
+Quote Post
danon198901
post 23.03.2013, 23:06:44
Post #3





Grupa: Zarejestrowani
Postów: 35
Pomógł: 0
Dołączył: 26.09.2012

Ostrzeżenie: (0%)
-----


super, dzięki za wskazówki;) Dokładnie mówiąc o textbox'ie chodzi mi właśnie o <input type="text" />
Wklepałem sobie:

  1. var btn=document.createElement("INPUT");
  2. btn.name = "przycisk";
  3. btn.id = "przycisk";
  4. document.body.appendChild(btn);


i działa:) Pytanie tylko skąd javascript wie, żeby generować type "text" skoro tego nie podałem? Przecież nie podałem <input type="text" />, więc równie dobrze może to być button/submit/checkbox/radio itp itd


Na kwestię id/name miał bym pomysł, dzięki któremu odbiór i późniejsza obróka informacji byłaby łatwiejsza. Wystarczyłoby wrzucić zmienna licznikowa, która zliczałaby ilość tych klików na button w wyniku czego każdy input typu "text" nazywał by się np. "text"+i+"". Później w php mógłbym napisać pętelkę for (i=1; i<=licznik; i++) {odebrać elementy z tablicy $_POST i wykonać na niej działanie}. Kwestia jest taka, że nie bardzo wiem jak ten licznik zaimplementować. Jeśli chodzi o zwykłą Jave to deklarowanie zmiennych nie inicjowanych żadnymi wartościami, kończyło się tym, że miały one wartości domyśle. Czyli np. int a; powodowało, że a posiadało 0. Wystarczyło sobie dopisać do obsługi button'a 'a=a+1;' i grało, natomiast w javascript wartości niezainicjalizowana posiada wartość "undefined", a więc muszę na początku dodać np. var a=0; w wyniku czego za każdym kliknięciem zmienna ta będzie zawsze inicjalizowana od nowa i nie zmieni wartości. No i koniec końców nie wiem jak w JS doprowadzić do tego, żeby wartość kliknięć była zliczana:( Any idea?
Go to the top of the page
+Quote Post
Pawel_W
post 23.03.2013, 23:15:48
Post #4





Grupa: Zarejestrowani
Postów: 1 675
Pomógł: 286
Dołączył: 15.06.2009
Skąd: Wieliczka

Ostrzeżenie: (0%)
-----


Cytat(danon198901 @ 23.03.2013, 23:06:44 ) *
Pytanie tylko skąd javascript wie, żeby generować type "text" skoro tego nie podałem? Przecież nie podałem <input type="text" />, więc równie dobrze może to być button/submit/checkbox/radio itp itd

odpowiedź na Twoje pytanie:
  1. <input />

zobacz co się stanie wink.gif
Go to the top of the page
+Quote Post
PrinceOfPersia
post 23.03.2013, 23:29:11
Post #5





Grupa: Zarejestrowani
Postów: 717
Pomógł: 120
Dołączył: 18.04.2009

Ostrzeżenie: (0%)
-----


Cytat
i działa:) Pytanie tylko skąd javascript wie, żeby generować type "text" skoro tego nie podałem? Przecież nie podałem <input type="text" />, więc równie dobrze może to być button/submit/checkbox/radio itp itd

pewnie domyślnie, ale nie polegałbym na tym bo nie wiadomo jak w różnych przeglądarkach będzie. Lepiej dopisać
Kod
btn.setAttribute('type', 'text');



Cytat
Jeśli chodzi o zwykłą Jave (...) natomiast w javascript wartości niezainicjalizowana posiada wartość "undefined"

JavaScript nie pochodzi od Javy więc nie idź tym tropem. Najbliżej JS do ActionScripta (którego się używa przy aplikacjach Flash).

Cytat
a więc muszę na początku dodać np. var a=0; w wyniku czego za każdym kliknięciem zmienna ta będzie zawsze inicjalizowana od nowa i nie zmieni wartości.

w JavaScript są różne zasięgi zmiennych. Możesz zadeklarować zmienną poza daną funkcją, i też będzie widoczna.


Kod
var a=0;
function powieksz() {
   a++;
}
powieksz();
alert(a);
powieksz();
alert(a);



--------------------
Go to the top of the page
+Quote Post
danon198901
post 24.03.2013, 17:06:50
Post #6





Grupa: Zarejestrowani
Postów: 35
Pomógł: 0
Dołączył: 26.09.2012

Ostrzeżenie: (0%)
-----


setAttribute() - size/maxlength itp widzę, że też można modyfikować, a więc kolejne pieczenie przy jednym ogniu upichciłem:D

Cytat(PriceOfPersia)
JavaScript nie pochodzi od Javy więc nie idź tym tropem.

A więc tylko nazwa wspólna:)

Cytat(PriceOfPersia)
w JavaScript są różne zasięgi zmiennych. Możesz zadeklarować zmienną poza daną funkcją, i też będzie widoczna.

I tu był pies pogrzebany. Kombinowałem jak cholera, a rozwiązanie trywialne sciana.gif

Jutro pobawię się jeszcze, być może nowe pytania się nasuną. Póki co dziękuję za wyczerpujące wypowiedzi thumbsupsmileyanim.gif


--@EDIT--
No i mam jeszcze kilka pytań. Po pierwsze pozycjonowanie textbox'u wydaje się nie działać - przynajmniej u mnie nie pozycjonuje, gdy wrzucę sobie coś takiego:

  1. <script type="text/javascript">
  2.  
  3. var licznik=0;
  4. function dodaj()
  5. {
  6. licznik++;
  7. var obj = document.createElement("INPUT");
  8. obj.setAttribute('type', 'text');
  9. obj.setAttribute('size', '2');
  10. obj.setAttribute('maxlength', '2');
  11. obj.name = "od"+licznik;
  12. obj.id = "od"+licznik;
  13. obj.style.left = "500px";
  14. obj.style.top = "500px";
  15. var objSec = document.createElement("INPUT");
  16. objSec.setAttribute('type', 'text');
  17. objSec.setAttribute('size', '2');
  18. objSec.setAttribute('maxlength', '2');
  19. objSec.name = "do"+licznik;
  20. objSec.id = "do"+licznik;
  21. objSec.style.left = "600px";
  22. objSec.style.top = "500px";
  23. document.body.appendChild(obj);
  24. document.body.appendChild(objSec);
  25.  
  26. }
  27. </script>


Kolejne pytanie brzmi: Jak może poprzez JS wywołać składnię html:
a ) <center></center>
b ) <label></label>
c ) <br />, żeby zrobić sobie pętelke, która za każdym kliknięciem będzie robić przejście do nowej lini, w wyniku czego nie będę miał generowanych elementów w ciągu (jednej lini)

Ten post edytował danon198901 24.03.2013, 17:08:37
Go to the top of the page
+Quote Post
PrinceOfPersia
post 24.03.2013, 18:58:41
Post #7





Grupa: Zarejestrowani
Postów: 717
Pomógł: 120
Dołączył: 18.04.2009

Ostrzeżenie: (0%)
-----


Bo musisz mieć w stylach ustawione position:absolute (albo inne, nie statyczne):
Kod
obj.style.position = "absolute";



Cytat
Kolejne pytanie brzmi: Jak może poprzez JS wywołać składnię html:
a ) <center></center>
b ) <label></label>
c ) <br />, żeby zrobić sobie pętelke, która za każdym kliknięciem będzie robić przejście do nowej lini, w wyniku czego nie będę miał generowanych elementów w ciągu (jednej lini)

Tak samo. Niezależnie od tego czy jest to element zamykany od razu <br /> czy taki, który może mieć dzieci <div>, </div> robisz tak samo.

Poza tym, możesz też operować na innerHTML, coś a la:
Kod
document.body.innerHTML += '<input type="text" size="2" maxlength="2" style="position:absolute;left:500px;top:500px" id="od'  + licznik + '"  />';




--------------------
Go to the top of the page
+Quote Post
danon198901
post 26.03.2013, 22:07:31
Post #8





Grupa: Zarejestrowani
Postów: 35
Pomógł: 0
Dołączył: 26.09.2012

Ostrzeżenie: (0%)
-----


Cytat(PrinceOfPersia)
Tak samo. Niezależnie od tego czy jest to element zamykany od razu <br /> czy taki, który może mieć dzieci <div>, </div> robisz tak samo.


No ok, ale na przykładzie center:
  1. var cent = document.createElement("CENTER");
  2. document.body.appendChild(obj);
  3. document.body.appendChild(objSec);
  4. var ent = document.createElement("BR");
  5. document.body.appendChild(ent);


skąd skrypt będzie wiedział kiedy zamknąć <center> ? Pewnie ja nie rozumuję poprawnie. createElement tworzy element, zaś fizycznie wstawienie go odbywa się poprzez appendChild tak? Zatem jeśli zaraz po zadeklarowaniu zmiennej cent umiejscowie appendChild wówczas powinno odbyć się 'wyśrodkowanie' wszystkiego tak? Bo generalnie wstawiam to i mimo wszystko nic nie wyśrodkowuje...no i co z elementem zamykającym? Wtedy zrobić var cent = document.createElement("/CENTER");

Cytat(PrinceOfPersia)
Poza tym, możesz też operować na innerHTML, coś a la:
document.body.innerHTML += '<input type="text" size="2" maxlength="2" style="position:absolute;left:500px;top:500px" id="od' + licznik + '" />';


Oooo to jest coś bardziej czytelnego i zrozumiałego. Wrzuciłem prosty test i niestety, ale po zastosowaniu funkcji innerHTML i kliknięciu na button moim oczom okazuje się nowa strona zastępująca poprzednią, a co za tym idzie nie mam możliwości po raz kolejny klikania na button czy wpisywaniu dalszych informacji.
Go to the top of the page
+Quote Post
Pawel_W
post 26.03.2013, 22:19:54
Post #9





Grupa: Zarejestrowani
Postów: 1 675
Pomógł: 286
Dołączył: 15.06.2009
Skąd: Wieliczka

Ostrzeżenie: (0%)
-----


document.createElement("center") tworzy Ci "kontener" do którego możesz dopiero ładować inną zawartość, która zostanie wyśrodkowana... samo takie wywołanie + appendChild do body spowoduje umieszczenie następującego kodu:
Go to the top of the page
+Quote Post
danon198901
post 26.03.2013, 22:45:52
Post #10





Grupa: Zarejestrowani
Postów: 35
Pomógł: 0
Dołączył: 26.09.2012

Ostrzeżenie: (0%)
-----


Cytat(Pawel_W @ 26.03.2013, 22:19:54 ) *
document.createElement("center") tworzy Ci "kontener" do którego możesz dopiero ładować inną zawartość, która zostanie wyśrodkowana... samo takie wywołanie + appendChild do body spowoduje umieszczenie następującego kodu:


no to w takim razie jak do tego kontenera załadować zawartość, która ma zostać wyśrodkowana? Bo sama regułka niewiele mi mówi:(
Go to the top of the page
+Quote Post
PrinceOfPersia
post 27.03.2013, 09:54:56
Post #11





Grupa: Zarejestrowani
Postów: 717
Pomógł: 120
Dołączył: 18.04.2009

Ostrzeżenie: (0%)
-----


Cytat
Zatem jeśli zaraz po zadeklarowaniu zmiennej cent umiejscowie appendChild wówczas powinno odbyć się 'wyśrodkowanie' wszystkiego tak?

no nie, bo dokument HTML ma strukturę hierarchiczną i pośrodkuje się tylko to co jest w danym pojemniku.

Cytat
Wtedy zrobić var cent = document.createElement("/CENTER");

nie. Jak robisz createElement to automatycznie tworzy on również zamykający tag. Myśl o tym jak o obiektach, bo zasadniczo tak jest - jest to programowanie obiektowe - tworzysz obiekty(createElement), dodajesz je do drzewa dokumentu (appendChild), ale możesz też wsadzać jeden obiekt w drugi i tworzyć bardziej skomplikowaną hierarchię.




--------------------
Go to the top of the page
+Quote Post
danon198901
post 29.03.2013, 18:55:29
Post #12





Grupa: Zarejestrowani
Postów: 35
Pomógł: 0
Dołączył: 26.09.2012

Ostrzeżenie: (0%)
-----


A więc reasumując jak dokładnie to zrobić, bo nadal nie rozkminiłem tego (poza teoria zagnieżdżenia jednego appendChild'a w drugim)sad.gif
Na moim przykładzie jak powinno wyglądać umieszczenie generowanych inputów wewnątrz tagu <center></center>?

  1. <input type="button" value="Dodaj" id="dodajp" onClick="dodaj()" />
  2.  
  3. <script type="text/javascript">
  4.  
  5. var licznik=0;
  6. function dodaj()
  7. {
  8. licznik++;
  9. var obj = document.createElement("INPUT");
  10. obj.setAttribute('type', 'text');
  11. obj.setAttribute('size', '2');
  12. obj.setAttribute('maxlength', '2');
  13. obj.name = "od"+licznik;
  14. obj.id = "od"+licznik;
  15.  
  16. var objSec = document.createElement("INPUT");
  17. objSec.setAttribute('type', 'text');
  18. objSec.setAttribute('size', '2');
  19. objSec.setAttribute('maxlength', '2');
  20. objSec.name = "do"+licznik;
  21. objSec.id = "do"+licznik;
  22.  
  23. var cent = document.createElement("CENTER");
  24. document.body.appendChild(obj);
  25. document.body.appendChild(objSec);
  26. var ent = document.createElement("BR");
  27. document.body.appendChild(ent);
  28.  
  29. }
  30. </script>


Chyba należę do tych "ciężej rozumujących" - muszę zobaczyć, bo nie "skapuję" tego:(
Go to the top of the page
+Quote Post
PrinceOfPersia
post 29.03.2013, 19:12:01
Post #13





Grupa: Zarejestrowani
Postów: 717
Pomógł: 120
Dołączył: 18.04.2009

Ostrzeżenie: (0%)
-----


no, normalnie:
cent.appendChild(obj);
cent.appendChild(objSec);

Cytat
Chyba należę do tych "ciężej rozumujących" - muszę zobaczyć,

w przeglądarkach są tzw. narzędzia dla developerów, Ctrl+Shift+J w Google Chrome, w Firefoxie i IE - F12 (w FF jak masz wtyczkę Firebug), w Operze Ctrl + Shift + I. I tam możesz "zobaczyć" strukturę dokumentu i wszystko generalnie co ci się wyprodukowało w JS.

poza tym w JS jest coś takiego jak pętla for, bo teraz dublujesz kod niepotrzebnie tworząc 2 inputy.


--------------------
Go to the top of the page
+Quote Post
danon198901
post 29.03.2013, 20:00:41
Post #14





Grupa: Zarejestrowani
Postów: 35
Pomógł: 0
Dołączył: 26.09.2012

Ostrzeżenie: (0%)
-----


heh...a ja szukalem i kombinowałem coś w stylu dodanie parametru w () dla appedChild'a businesssmiley.png

Cytat(PrinceOfPersia)
poza tym w JS jest coś takiego jak pętla for, bo teraz dublujesz kod niepotrzebnie tworząc 2 inputy.

Tak wiem wiem:D Pisałem coś tam w C#, PHP i jeszcze kilku językach i pętle/instrukcje warunkowe itp są raczej nieodzowną częścią każdego języka programowania:P
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 1.05.2025 - 05:23