Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [js] Wyprowadzenie zmiennej z dwóch funkcji..
Forum PHP.pl > Forum > Po stronie przeglądarki > JavaScript
BirdWatcher
  1. function checkLogin() {
  2.  
  3. var url = "http://www.hyipek2.yoyo.pl/ajax.php?login=";
  4. var login = document.getElementById("login").value;
  5. if(login.length != 0){
  6. var http = getHTTPObject();
  7. http.open("GET", url + escape(login), true);
  8. http.onreadystatechange = function() {
  9. var login_ok = 0
  10. if (http.readyState != 4) {
  11. document.getElementById("login_check").style.backgroundColor='#FFFF99';
  12. document.getElementById("login_check").innerHTML = 'sprawdzam...';
  13. } else {
  14.  
  15. var numer = parseInt(http.responseText);
  16. if(numer == 0){
  17. document.getElementById("login_check").style.backgroundColor='#CCFF66';
  18. document.getElementById("login_check").innerHTML = "Login poprawny";
  19. login_ok = 1;
  20. }else if(numer == 1){
  21. document.getElementById("login_check").style.backgroundColor='#FF9966';
  22. document.getElementById("login_check").innerHTML = "Podany login jest zajety";
  23. login_ok = 0;
  24. }else{
  25. document.getElementById("login_check").innerHTML = numer;
  26. }
  27. }
  28. return login_ok;
  29. }
  30. http.send(null);
  31. }
  32.  
  33. }


może ktos pomoże, bo juz 3.36 czyli mecze sie z tym od ponad 3 godzin biggrin.gif
Jak mam wziąc zmienna 'login_ok' wyprowadzic na zewnatrz?

probowalem na wiele sposobow,
var lo_ok = checkLogin(); zwraca undefined ;/

dzieki winksmiley.jpg
nevt
w ten sposób w jaki próbujesz - nie da sie. wynika to ze sposobu działania AJAX'a. funkcja, która podstawiasz do onreadystatechange wywołuje się dopiero PO otrzymaniu odpowiedzi z serwera... a zanim to nastąpi, twoja funkcja checkLogin() dawno już skończy swoje działanie... proponuję, żebyś zamiast takiej konstrukcji zdefiniował sobie dodatkową funkcję, np. loginAnswer(login_ok){...} i wywoływał ją tam gdzie teraz ustawiasz login_ok, czyli:
Kod
// wewnątrz checkLogin(), zamiast
login_ok = 1;
// wpisujesz
loginAnswer(1);
// i definiujesz sobie funkcję
function loginAnswer(login_ok)
{
// i tutaj wpisujesz kod, zalezny od tego czy serwer potewierdził login czy nie...
}

można to zrobić na różne sposoby, ale tak jak proponuję nie będziesz miał zbyt wielu zmian w swoim kodzie... powodzenia.
lord_t
Ten login_ok jest zwracany przez tę funkcję wewnętrzną. A nie przez checkLogin(). Dlatego zawsze zwróci undefined - bo 'nic' nie zwraca i to 'nic' chcesz przypisac do zmiennej lo_ok.

Musiałbyś return z login_ok przenieść przed ostatni nawias klamrowy.
BirdWatcher
Cytat(nevt @ 27.01.2008, 12:04:57 ) *
w ten sposób w jaki próbujesz - nie da sie. wynika to ze sposobu działania AJAX'a. funkcja, która podstawiasz do onreadystatechange wywołuje się dopiero PO otrzymaniu odpowiedzi z serwera... a zanim to nastąpi, twoja funkcja checkLogin() dawno już skończy swoje działanie... proponuję, żebyś zamiast takiej konstrukcji zdefiniował sobie dodatkową funkcję, np. loginAnswer(login_ok){...} i wywoływał ją tam gdzie teraz ustawiasz login_ok, czyli:
Kod
// wewnątrz checkLogin(), zamiast
login_ok = 1;
// wpisujesz
loginAnswer(1);
// i definiujesz sobie funkcję
function loginAnswer(login_ok)
{
// i tutaj wpisujesz kod, zalezny od tego czy serwer potewierdził login czy nie...
}

można to zrobić na różne sposoby, ale tak jak proponuję nie będziesz miał zbyt wielu zmian w swoim kodzie... powodzenia.

Dzieki za pomoc, tylko ze moj problem polega na tym ze ja potrzebuje wlasnie ten login_ok urzyc w innej funckcji.
PO prostu chodzi o to zeby funkcja ktora rejestruje (tez w ajaxie) po nacisnieciu przycisku wyslij, nie sprawdzala drugi raz czy login jest wolny, ale wlasnie wziela te informacje z check_login, wkleje tutaj jeszcze tę funkcje rejestrującą.

  1. function registration(){
  2.  
  3. var lo_ok = checkLogin();
  4. var error = false;
  5. var url = "http://www.hyipek2.yoyo.pl/ajax.php?rejestracja=tak&";
  6. var login = document.getElementById("login").value;
  7. var pass = document.getElementById("pass").value;
  8. var email = document.getElementById("email").value;
  9. var okno = document.getElementById("error");
  10. var close = "<div align='right' valign='bottom'><a href='javascript: void(\"0\");' onClick=\"closeWindow();\">Zamknij</a></div>";
  11. var closeMove = "<div align='right' valign='bottom'><a href='javascript: void(\"0\");' onClick=\"closeWindowMove();\">Zamknij</a></div>";
  12. if(email.length == 0){
  13. okno.style.display = "block";
  14. okno.innerHTML = "<center>Wpisz adres email.<br></center>" + close;
  15. error = true;
  16. }
  17. if(pass.length == 0){
  18. okno.style.display = "block";
  19. okno.innerHTML = "<center>Wpisz hasło.<br><center>" + close;
  20. error = true;
  21. }
  22. if(login.length == 0){
  23. okno.style.display = "block";
  24. okno.innerHTML = "<center>Wpisz login.<br><center>" + close;
  25. error = true;
  26. }
  27.  
  28. if (lo_ok != 1){
  29. okno.style.display = "block";
  30. okno.innerHTML = "<center>Podany login jest niepoprawny.<br></center>"+ log_ok + close;
  31. error = true;
  32. }
  33.  
  34.  
  35. if(error == false){
  36.  
  37. var http = getHTTPObject();
  38. http.open("GET", url + "rlogin=" + escape(login) + "&pass=" + escape(pass) + "&email=" + escape(email), true);
  39. http.onreadystatechange = function() {
  40. if (http.readyState != 4) {
  41. okno.style.display = "block";
  42. okno.innerHTML = "<img src='loading.gif'><br><center>Rejestruje...</center>";
  43. } else {
  44. var numer = parseInt(http.responseText);
  45. if(numer == 0){
  46. okno.innerHTML = "<center>Zarejestrowano pomyslnie !<br></center>" + closeMove;
  47. }else {
  48. okno.innerHTML = "<center>Blad rejestracji, sprobuj ponownie.<br></center>" + close;
  49. }
  50. }
  51. }
  52. http.send(null);
  53.  
  54.  
  55.  
  56. }
  57.  
  58.  
  59.  
  60. }


Cytat(lord_t @ 27.01.2008, 12:08:22 ) *
Ten login_ok jest zwracany przez tę funkcję wewnętrzną. A nie przez checkLogin(). Dlatego zawsze zwróci undefined - bo 'nic' nie zwraca i to 'nic' chcesz przypisac do zmiennej lo_ok.

Musiałbyś return z login_ok przenieść przed ostatni nawias klamrowy.

Próbowałem tak, ale wtedy miałem bład ze login_ok nie zdefiniowana, bo byla definiowana w tej wewnetrznej funkcji, z kolei jak zdefiniowalem w funkcji zewnetrznej, to ta wewnetrzna jej nie zmieniala, i caly czas byla taka jak zdefiniowalem.

mimo to dzieki;)
nevt
masz już prawie dobrze, tylko zrozum, że nie da się tego zrobić przez przekazanie zmiennej w kodzie. postaram ci się to wytłumaczyć:

1. Wywołujesz funkcję checkLogin()...
2. Funkcja ta generuje w AJAX zapytanie do serwera...
3. Przeglądarka NIE CZEKA na wyniki z serwera, tylko dalej wykonuje twoją funkcję checkLogin()... dlatego wewnątrz niej NIE JESTEŚ W STANIE określić login_ok
4. Po pewnym czasie serwer przesyła do przeglądarki odpowiedź i dopiero WTEDY jest wywoływana funkcja przypisana wcześniej do onreadystatechange (to pewne uproszczenie ale wystarczy żeby zrozumiał istotę problemu).
5. Wniosek tego z taki, że tylko wewnątrz tej funkcji przypisanej do onreadystatechange możesz określić co ma zrobić przeglądarka z danymi zwróconymi przez serwer...

Podsumowując, musisz zmienić logikę i organizację twoich skryptów... mniej więcaj tak:
1. kliknięcie na guzik "zaloguj" wywołuje funkcję powiedzmy tryLogin(user, pwd).
2. wewnątrz niej robisz zapytanie AJAX i rejestrujesz funkcję obsługi odpowiedzi (przypisaną do onreadystatechange)
3. wewnątrz tej funkcji określasz, czy logowanie powiodło sie...
4. i wtedy dopiero wywołujesz funkcję odpowiedzialną za reakcję na udane lub nieudane logowanie, np. registration(login_ok);

powodzenia.
BirdWatcher
dzieki, juz rozumie dlaczego nie dziala biggrin.gif tylko jeszcze problem z rozwiazaniem tego, czy mógłbym to zrobic np. tak:

wewnątrz checkLogin, zamiast login_ok=1 daje np. ifLoginOk(1) a ta funkcja wyglada po prostu tak :

ifLoginOk(login){
var login_ok = login;
return login_ok;
}

i czy teraz ta zwrocona login_ok bedize dostepna dla innych funkcji czy nadal nie bardzo ?

sory za takie lamerskie pytania, ale o js nie mam zbytniego pojecia i staram sie to w pewien sposob wzorowac na PHP o ktorym wiem co nieco winksmiley.jpg

PS> i jeszcze do tego co napisales powyżej, ten sposob rozumie, tylko ze wtedy ajax sprawdzajacy czy login jest w bazie bedzie wywolywany 2 razy, jeden bo opuszczenia pola login w formularzu, a drugi po nacisnieciu wyslij, i wlasnie zastranawiam sie nad tym czy da sie to ominac.
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.