Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Problem ze wskazaniem konkretnego formularza w jQuery
Barton
post
Post #1





Grupa: Zarejestrowani
Postów: 70
Pomógł: 2
Dołączył: 26.10.2008

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


Witam,

Napisałem taką funkcję obsługującą dodawanie komentarzy formularza:

  1. $('#commentform').submit(function() {
  2.  
  3. var $form = $(this);
  4. $inputs = $form.find("input, select, button, textarea"),
  5. serializedData = $form.serialize();
  6. $inputs.attr("disabled", "disabled");
  7.  
  8. $.ajax( {type: 'POST', url: 'dodaj.html', dataType:'json', data: serializedData, success: function(dane) {
  9.  
  10. $inputs.removeAttr("disabled");
  11. $('.komentarzform' + dane.id).prepend('...');
  12. var ile = $('#divkomentarz' + dane.id).css('height');
  13. var iles = parseInt(ile);
  14. var ilenowy = $('#nowykomentarz' + dane.id).css('height');
  15. var ilenowys = parseInt(ilenowy);
  16. var suma = iles + ilenowys;
  17. $('#divkomentarz' + dane.id).css('height', suma + 'px');
  18. $('#nowykomentarz' + dane.id).slideDown("slow");
  19.  
  20. }, error: function (XMLHttpRequest, textStatus, errorThrown) { alert(errorThrown); }});
  21.  
  22. return false;
  23.  
  24. });


Problem jest taki, że działa ona tylko w pierwszym divie z komentarzami, czyli odnośnie pierwszego formularza. Zakładając że mam na stronie 10 formularzy, po dodaniu komentarza za pomocą pierwszego komentarz się pojawia tam gdzie powinien. Korzystając z jakiegokolwiek innego, komentarz również dodaje się tam gdzie powinien, ale po przeładowaniu strony, co jest bardzo dziwne gdyż plik PHP obsługujący dodawanie elementów do bazy nie ma nawet nagłówka kierującego z powrotem na stronę główną. Odnoszę wrażenie że to przez brak odniesienia do konkretnego formularza. Co przypisać zmiennej $form żeby zawsze odnosiła się do odpowiedniego

Ten post edytował Barton 16.03.2012, 13:30:55
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 8)
rocktech.pl
post
Post #2





Grupa: Zarejestrowani
Postów: 587
Pomógł: 131
Dołączył: 8.02.2010

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


Witam.

http://api.jquery.com/jQuery.each/

[JAVASCRIPT] pobierz, plaintext
  1. $('.commentform')each(function(element) {
  2. element.submit(function() { ....
[JAVASCRIPT] pobierz, plaintext


Go to the top of the page
+Quote Post
Barton
post
Post #3





Grupa: Zarejestrowani
Postów: 70
Pomógł: 2
Dołączył: 26.10.2008

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


Dzięki za szybką odpowiedź. Teraz moja funkcja wygląda tak:

  1. $('#commentform')each(function(element) {
  2. element.submit(function() {
  3.  
  4. var $form = $(this);
  5. $inputs = $form.find("input, select, button, textarea"),
  6. serializedData = $form.serialize();
  7. $inputs.attr("disabled", "disabled");
  8.  
  9. $.ajax( {type: 'POST', url: 'dodaj.html', dataType:'json', data: serializedData, success: function(dane) {
  10.  
  11. $inputs.removeAttr("disabled");
  12. $('.komentarzform' + dane.id).prepend('...');
  13. var ile = $('#divkomentarz' + dane.id).css('height');
  14. var iles = parseInt(ile);
  15. var ilenowy = $('#nowykomentarz' + dane.id).css('height');
  16. var ilenowys = parseInt(ilenowy);
  17. var suma = iles + ilenowys;
  18. $('#divkomentarz' + dane.id).css('height', suma + 'px');
  19. $('#nowykomentarz' + dane.id).slideDown("slow");
  20.  
  21. }, error: function (XMLHttpRequest, textStatus, errorThrown) { alert(errorThrown); }});
  22.  
  23. return false;
  24.  
  25. });
  26. });


I w tym momencie strona odświeża się przy każdym formularzu, nawet tym pierwszym. (IMG:style_emoticons/default/sad.gif) Poza tym wciąż się zastanawiam jakim cudem strona się przeładowuje gdyż poza JavaScriptem nie ma żadnych instrukcji wracających na stronę główną.

Ten post edytował Barton 16.03.2012, 13:42:40
Go to the top of the page
+Quote Post
rocktech.pl
post
Post #4





Grupa: Zarejestrowani
Postów: 587
Pomógł: 131
Dołączył: 8.02.2010

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


http://api.jquery.com/event.preventDefault/

[JAVASCRIPT] pobierz, plaintext
  1. element.submit(function(event) {
  2. event.preventDefault();
  3.  
[JAVASCRIPT] pobierz, plaintext


I jeszcze jedno nie zapominaj o tym, że id musi być unikalne.

[JAVASCRIPT] pobierz, plaintext
  1. $('#divkomentarz' + dane.id).css('height', suma + 'px');
  2. $('#nowykomentarz' + dane.id).slideDown("slow");
[JAVASCRIPT] pobierz, plaintext


Nie widziałem kodu html na stronie ale zakładam, że tak nie jest.
Go to the top of the page
+Quote Post
Barton
post
Post #5





Grupa: Zarejestrowani
Postów: 70
Pomógł: 2
Dołączył: 26.10.2008

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


Id są unikalne, do każdej nazwy identyfikatora dodaję przez PHP identyfikator postu.

Wracając do tematu niestety nic mi to nie dało i w tym przypadku żadna akcja po prostu się nie wykonuje i przerzuca do strony zajmującej się skryptem php. Skleciłem coś takiego:

  1. $('#commentform').each(function(element){
  2. element.submit(function() {
  3.  
  4. var $form = element;
  5. $inputs = $form.find("input, select, button, textarea"),
  6. serializedData = $form.serialize();
  7. $inputs.attr("disabled", "disabled");
  8.  
  9. $.ajax( {type: 'POST', url: 'dodaj.html', dataType:'json', data: serializedData, success: function(dane) {
  10.  
  11. $inputs.removeAttr("disabled");
  12. $('.komentarzform' + dane.id).prepend('...');
  13. var ile = $('#divkomentarz' + dane.id).css('height');
  14. var iles = parseInt(ile);
  15. var ilenowy = $('#nowykomentarz' + dane.id).css('height');
  16. var ilenowys = parseInt(ilenowy);
  17. var suma = iles + ilenowys;
  18. $('#divkomentarz' + dane.id).css('height', suma + 'px');
  19. $('#nowykomentarz' + dane.id).slideDown("slow");
  20.  
  21. }, error: function (XMLHttpRequest, textStatus, errorThrown) { alert(errorThrown); }});
  22.  
  23. return false;
  24.  
  25. });
  26.  
  27. });


Ale to również nie działa. Nie użyłem metody event.preventDefault(); gdyż nawet po przeczytaniu dokumentacji nie za bardzo rozumiem czemu ona służy, a nawet po jej dodaniu nic to nie zmienia. Jakiś pomysł dlaczego pomimo zdefiniowania akcji 'submit', nie jest ona w ogóle wykonywana? (IMG:style_emoticons/default/sad.gif)

Kod HTML formularza:

  1. <form class="commentform" method="post" action="dodaj.html">
  2. <div style="width:100px; height:auto; text-align:right; float:left;">
  3. <p class="tresckomentarza" style="margin-top:4px;">Nick:  </p>
  4. <p class="tresckomentarza" style="margin-top:9px;">Treść:  </p>
  5. </div>
  6. <div style="width:192px; height:auto; float:left;">
  7. <input maxlength="30" type="input" placeholder=" twój nick" style="margin-top:2px; margin-bottom:0px; width:180px; height:18px; border:1px solid #fda21d; font-family:Tahoma; font-size:8pt; color:#57564e; " name="nickname" />
  8. <input maxlength="1000" type="input" placeholder=" treść komentarza" style="margin-top:2px; width:180px; height:18px; border:1px solid #fda21d; font-family:Tahoma; font-size:8pt; color:#57564e; " name="tresc" />
  9. </div>
  10. <div style="width:100px; height:auto; text-align:center; float:left;">
  11. <input type="submit" style="border:1px solid #fda21d; width:70px; margin-top:16px; " value="dodaj">
  12. </div>
  13. <input type="hidden" name="token" value="komentarz">
  14. <input type="hidden" name="idpostu" value="<? echo $row['id']; ?>">
  15. </form>


EDIT: zorientowałem się również że wszystkie 10 formularzy ma ten sam identyfikator więc zmieniłem je na klasę (edytując również pierwszą linijkę na $('.commentform').each(function(element){ ). To również nic nie dało.

Ten post edytował Barton 16.03.2012, 16:12:18
Go to the top of the page
+Quote Post
cudny
post
Post #6





Grupa: Zarejestrowani
Postów: 387
Pomógł: 66
Dołączył: 31.03.2005
Skąd: Kielce

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


  1. $('.commentform').each(function() {
  2. console.log($(this));
  3. });
Go to the top of the page
+Quote Post
markonix
post
Post #7





Grupa: Zarejestrowani
Postów: 2 707
Pomógł: 290
Dołączył: 16.12.2008
Skąd: Śląsk

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


edit: nie przeczytałem kodu dokładnie

Ten post edytował markonix 16.03.2012, 17:51:59
Go to the top of the page
+Quote Post
Barton
post
Post #8





Grupa: Zarejestrowani
Postów: 70
Pomógł: 2
Dołączył: 26.10.2008

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


Problem rozwiązany:

Okazało się że pierwotny kod był całkowicie działający, tylko że korzystając z akcji $(document).ready(); zdążył się załadować tylko jeden formularz (które to są ładowane w pętli przez php). Dlatego też skrypt działał tylko w pierwszym formularzu. Sprawę rozwiązało umieszczenie skryptu w metodzie $(window).load();.

Pozdrawiam i jeszcze raz dzięki!
Go to the top of the page
+Quote Post
cudny
post
Post #9





Grupa: Zarejestrowani
Postów: 387
Pomógł: 66
Dołączył: 31.03.2005
Skąd: Kielce

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


Cytat(Barton @ 16.03.2012, 17:46:34 ) *
Problem rozwiązany:

Okazało się że pierwotny kod był całkowicie działający, tylko że korzystając z akcji $(document).ready(); zdążył się załadować tylko jeden formularz (które to są ładowane w pętli przez php). Dlatego też skrypt działał tylko w pierwszym formularzu. Sprawę rozwiązało umieszczenie skryptu w metodzie $(window).load();.

Pozdrawiam i jeszcze raz dzięki!



Że niby co ? $(document).ready(function() { //kod }); wewnątrz metody ready() skrypty zaczynają się wykonywać dopiero po zaczytaniu całego DOM'a !
W takim wypadku może miałeś jakąś funkcję poniżej kodu wykonywalnego, bo $(window).load() na bank nie naprawił Ci skryptu.

Polecam: http://api.jquery.com/ready/
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 24.08.2025 - 00:42