Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP][AJAX][JavaScript]Problem z odbieraniem danych a wywołania AJAXa
sebap123
post
Post #1





Grupa: Zarejestrowani
Postów: 253
Pomógł: 1
Dołączył: 26.08.2009
Skąd: Szczecin

Ostrzeżenie: (10%)
X----


Mam pewien problem ze swoim skryptem. Umieściłem w nim weryfikację e-mail przy pomocy skryptu php. Z formularza do skryptu dane przy pomocy skryptu w jQuery i ajaxa przechodzą do skryptu.
Generalnie przechodzą i są sprawdzane poprawnie. Problem polega na tym, że nie wiem jak dane przychodzące sprawdzić i coś na tej bazie zrobić.

fragment kodu o który mi chodzi wygląda następująco:
[JAVASCRIPT] pobierz, plaintext
  1. function validateEmail()
  2. {
  3. var text = email.val();
  4. var flag = "";
  5. if(email.val().length<5)
  6. {
  7. alert("za krotki mail");
  8. return false;
  9. }
  10. var request = $.ajax({
  11. type:"POST",
  12. url:"test2.php",
  13. data:"opcja=email&wartosc="+text,
  14. success:function(data){
  15. if(data=="true")
  16. {
  17. flag="correct";
  18. alert("1."+flag);
  19. }
  20. },
  21. error:function(XMLHttpRequest, textStatus, errorThrown)
  22. {
  23. alert("Wystapił bład");
  24. }
  25. });
  26. request.fail(function(){alert("Wystąpił błąd");});
  27. if(flag=="correct")
  28. alert("ok");
  29. else
  30. alert("2."+flag);
  31. }
[JAVASCRIPT] pobierz, plaintext

Jak dla mnie wszystko działa tzn. wysyłam dane do pliku test2.php a następnie dzięki funkcji przy atrybucie sukces odbieram dane i jeśli jest true to ustawiam flagę. Potem, jeśli flaga jest correct to kończę funkcję z wynikiem true.
Rzeczywistość jest jednak inna - gdy wykonuję skrypt to zawsze najpierw wywołany zostaje alert z nr 2 a dopiero potem z nr 1 czyli tak jakby kod był wykonywany od dołu i dlatego nigdy flag nie jest przypisany.

Tutaj jest cała strona na której to testuje:
http://sebastianperyt.pl/javascript/testJQ.html

Będę wdzięczny za podpowiedzi.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 6)
toffiak
post
Post #2





Grupa: Zarejestrowani
Postów: 395
Pomógł: 80
Dołączył: 24.08.2009

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


W firebugu widzę że twój skrypt zwraca false, więc flaga nie jest correct i wyświetlany jest alert z napisem 2


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





Grupa: Zarejestrowani
Postów: 253
Pomógł: 1
Dołączył: 26.08.2009
Skąd: Szczecin

Ostrzeżenie: (10%)
X----


Wiem, że skrypt zwraca false, ale dlatego, że najpierw wykonuje się dół skryptu, a potem dopiero góra, czyli przypisanie flagi. Można to zobaczyć przy wyświetlaniu formularzy. Najpierw się wyświetla nr 2 a potem nr 1

EDIT:
Wszystko wygląda teraz tak, jakby zmienna flag nie zachowywała swojego przypisania. Ponieważ po pierwszym przypisaniu wartości data potem ją gubi i wraca do początkowych ustawień (tak się dzieje w Firefoksie) natomiast w Chromie tak jak mówiłem "leci od tyłu", czyli najpierw sprawdza zawartość zmiennej flag a potem dopiero ja przypisuje.

Ten post edytował sebap123 17.11.2011, 22:53:37
Go to the top of the page
+Quote Post
nospor
post
Post #4





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




ajax wykonuje się asynchronicznie. Tzn. ze zapuszczasz ajax, id od razu idą dalsze polecenia js, a ajax sobie działa w tle. Także Twoja funkcja success może się wykonać np. po dwóch sekudanch po odpaleniu - wszystko zależy jak szybko odpowie serwer. A w tym czasie może się spokojnie wykonać cały inny dalszy kod js. Także ten kod:
if(flag=="correct")
alert("ok");
else
alert("2."+flag);
Jest bez sensu, bo odpala się niezależnie od wyników zwracanych przez serwer. Jeśli ten kod ma mieć sens, to ma być wykonywane w funkcji success


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
sebap123
post
Post #5





Grupa: Zarejestrowani
Postów: 253
Pomógł: 1
Dołączył: 26.08.2009
Skąd: Szczecin

Ostrzeżenie: (10%)
X----


No dobra, to trochę mi rozjaśniłeś już sprawę. Problem jednak w tym, że nie wiem jak inaczej mogę wykonać to co mam wykonać, czyli po prostu chce, żeby cała funkcja validateEmail zwróciła mi albo true albo false w zależności od tego jaki był jej wynik na który składa się sprawdzenie rozmiaru - to po to, żeby niepotrzebnie nie wysyłać danych na serwer które i tak są bez sensu, a także sam wynik operacji walidacji na serwerze.
Można oczywiście dodać jakąś animację oczekiwania - tyle tylko, ze średnio wiem jak ją umieścić, lub wpisać parametr ajaxa async:false, ale napisane jest, że może to zablokować okno przeglądarki.
Własnie dlatego, nie mam pomysłu co z tym zrobić i jak ten problem rozwiązać. Czy ma ktoś może jakąś sugestię?
Go to the top of the page
+Quote Post
Niktoś
post
Post #6





Grupa: Zarejestrowani
Postów: 1 195
Pomógł: 109
Dołączył: 3.11.2011

Ostrzeżenie: (10%)
X----


Cytat
ajax wykonuje się asynchronicznie

A co jeśli w Ajaxie zastosujemy.
Async:false; ?
Cytat
lub wpisać parametr ajaxa async:false, ale napisane jest, że może to zablokować okno przeglądarki

Ja u siebie mam i półki co jeszcze nic mi nie zablokowało-chyba są to skrajne przypadki.

Ten post edytował Niktoś 18.11.2011, 21:01:28
Go to the top of the page
+Quote Post
sebap123
post
Post #7





Grupa: Zarejestrowani
Postów: 253
Pomógł: 1
Dołączył: 26.08.2009
Skąd: Szczecin

Ostrzeżenie: (10%)
X----


Dzięki za pomoc. Własnie potrzebowałem opinii kogoś kto już tego rozwiązania używa. Problem rozwiązany.

EDIT:

Niestety muszę umieścić edita z powtórzeniem pytania, lub jego niewielka zmianą. Zacząłem teraz testować walidację z ajaxem wysyłanym z parametrem async:false, czyli zapytanie jest wysyłane synchronicznie. W moim wypadku niestety skrypty sprawdzające (podłączenie do bazy w celu sprawdzenia loginu czy emaila, a także sprawdzenie emaila na podstawie checkdnsrr) trwa na tyle długo, że jest odczuwalne to na stronie - rzeczywiści powoduje około sekundowe zawieszenie.
Wyjście jakie przyszło mi do głowy to puszczenie go jednak w tle i dodanie np jakiegoś gifa z animacja ładowania, tyle tylko, że nie wiem jak to dodać do ajaxa, żeby się wykonywało w czasie oczekiwania na wynik i nie wiem jak wtedy na bazie wyniku zapytania zwrócić wynik z funkcji validateEmail.

Czy może mi ktoś coś doradzić?

Ponawiam swoją prośbę o pomoc w tym temacie. Jeszcze raz przeanalizowałem problem i doszedłem do wniosku, że bez działania asynchronicznego nie mam zielonego pojęcia jak poprawnie odebrać wynik z funkcji validateEmail(), a z asynchronicznym działaniem niestety zawieszanie strony jest zbyt znaczące. Czy ktoś już miał może taki problem i może coś poradzić?
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 Aktualny czas: 20.08.2025 - 13:54