Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem ze wskazaniem konkretnego formularza w jQuery
Forum PHP.pl > Forum > XML, AJAX > AJAX
Barton
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
rocktech.pl
Witam.

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

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


Barton
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. 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ą.
rocktech.pl
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.
Barton
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? 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.
cudny
  1. $('.commentform').each(function() {
  2. console.log($(this));
  3. });
markonix
edit: nie przeczytałem kodu dokładnie
Barton
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!
cudny
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/
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.