Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ajax][js]problem ze zwracaniem
Forum PHP.pl > Forum > Po stronie przeglądarki > JavaScript
kapke
no cóż, mam sobie taką oto klasę:
CODE
[JAVASCRIPT] pobierz, plaintext
  1. function ajaks () {
  2. this.tekst = 'a';
  3. var request = false;
  4. request = new XMLHttpRequest(); //tworzymy obiekt XMLHttpRequest
  5. this.insertData = function (zrodlo, cel) {
  6. var cel = document.getElementById(cel);
  7. request.open("GET", zrodlo, true);
  8. request.onreadystatechange = function () {
  9. if (request.readyState == 4) { //jeśli to, co było zarządane: źródło,
  10. cel.innerHTML = request.responseText; //to wstawiamy to to w cel
  11. }
  12. }
  13. request.send(null); //nic nie wysyłamy
  14. }
  15. this.getData = function (zrodlo) {
  16. request.tekst = 'b';
  17. request.open("GET", zrodlo, true);
  18. request.onreadystatechange = function () {
  19. if (request.readyState == 4) {
  20. this.tekst = request.responseText; //1
  21. }
  22. }
  23. request.send(null);
  24. return this.tekst; //2
  25. }
  26. }
[JAVASCRIPT] pobierz, plaintext

i problem jest taki, że w momencie 1 (metoda getData) pole tekst ma taką wartość, jakiej oczekuję: zawartość pliku, lecz, gdy już chcę zwrócić tą wartość w celu późniejszego wykorzystania, otrzymuję 'a', a nie zawartość pliku. Ktoś wie, jak sobie z tym poradzić/czemu to nie działa tak, jak ja chcę?
P.S. metoda insertData działa dokładnie tak jak oczekuję: wstawia zawartość pliku do diva, czego tylko zechcę
kamil4u
Gdyż this ma w tym momencie inną wartość...
Skorzystaj z: apply - https://developer.mozilla.org/en/JavaScript.../Function/Apply
Lub prościej:
Kod
that = this; //<---
this.getData = function (zrodlo) {
request.tekst = 'b';
request.open("GET", zrodlo, true);
request.onreadystatechange = function () {
if (request.readyState == 4) {
that.tekst = request.responseText; //1  //<---
}
}
request.send(null);
return this.tekst; //2
kapke
CODE
[JAVASCRIPT] pobierz, plaintext
  1. that = this;
  2. this.tekst = 'a'
  3. this.getData = function (zrodlo) {
  4. request.open("GET", zrodlo, true);
  5. request.onreadystatechange = function () {
  6. if (request.readyState == 4) {
  7. that.tekst = request.responseText;
  8. alert(that.tekst);
  9. }
  10. }
  11. request.send(null);
  12. return this.tekst;
  13. }
[JAVASCRIPT] pobierz, plaintext

kod, który dałeś, nie działa... tzn, działa, ale nie tak jak powinien...
co ciekawe: zwrócone jest a, ale alert wyświetla dokładnie, to co mnie interesuje...
no cóż, zrobiłem to tak, że stworzyłem diva z display: none, i tam ląduje zawartość interesującego mnie pliku, choć nie jest toto rozwiązanie, które mnie satysfakcjonuje
#luq
Bo nie rozumiesz idei asynchroniczności...

Masz metodę getData w której jest wysłany request przez ajax`a i zdefiniowana jest funkcja wykonywana przy zdarzeniu readyStateChange, która dopiero z przypadku dostania odpowiedzi zmienia this.tekst, oczywiście zdarzenie jest wykonywane swoim tokiem, bo funkcja wykonywana podczas wystąpienie tego zdarzenia jest jedynie w tym miejscu zdefiniowana a nie wykonana a więc w czasie dojścia do lini 12:

Kod
return this.tekst;


this.tekst nie ma możliwości właściwie (teoretycznie jest jeśli zapytanie zostało wysłane i odebrane w setnych częściach sekundy) przybrać stan tego jaki ma zostać przypisany do niego z ajax`owego requesta.

W sumie requestów synchronicznych nigdy nie wykonywałem ale powinno pomóc winksmiley.jpg
kapke
ok, dzięki wielkie
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.