Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][AJAX][JavaScript]Problem z odbieraniem danych a wywołania AJAXa
Forum PHP.pl > Forum > Przedszkole
sebap123
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.
toffiak
W firebugu widzę że twój skrypt zwraca false, więc flaga nie jest correct i wyświetlany jest alert z napisem 2
sebap123
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.
nospor
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
sebap123
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ę?
Niktoś
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.
sebap123
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ć?
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.