Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ajax] Jak przekazać zmienną "w górę" z Ajax.Request
Forum PHP.pl > Forum > XML, AJAX
qBK
Witam, od niedawna bawię się ajaksem i mam następujący problem:
  1. <?php
  2. function getValue(id, mode)
  3. {
  4. var url = 'http://server/x.php';
  5. var pars = 'mode='+mode+'&id=' + id;
  6.  
  7. var output = '';
  8.  
  9. var myAjax = new Ajax.Request(
  10. url,
  11. {
  12. method: 'get',
  13. parameters: pars,
  14. onComplete: function(originalRequest) {
  15. // ten output ma iść "na zewnątrz"
  16. output = originalRequest.responseText;
  17. }
  18. }
  19. );
  20. return output;
  21. }
  22. ?>


Chodzi mi o to, żeby w linijce 16. wyeksportować jakoś zmienną output żebym mógł ją zwrócić w 20. Dodam że korzystam z prototype jeśli to ważne.
revyag
A czemu nie zrobisz tak:
Kod
onComplete: function(originalRequest) {
    //ten output ma iść "na zewnątrz"
    return  originalRequest.responseText;
}
qBK
Gdybym zrobił tak jak piszesz, to ta 'wewnętrzna' funkcja onComplete: function(originalRequest) { }, która jest tworzona wewnątrz obiektu Ajax.Request, zwróciłaby wartość, a nie funkcja 'zewnętrzna' getValue; to nie działa tak jak przerwanie w pętli typu na przykład
  1. <?php
  2. function x()
  3. {
  4.  for($i=1; $i<10; ++$i)
  5.  {
  6.  if($i == 4) return;
  7.  }
  8. }
  9. ?>
revyag
Wydaje mi się że asynchronicznie tego nie zrobisz. Nie wiem jak jest w prototype, ale jquery umożliwia synchroniczny request przypisujący wynik żądania bezpośrednio do zmiennej. Poszukaj w dokumentacji, może coś piszą o tym.
Tak to w jquery wygląda:
Kod
var html = $.ajax({ url: "some.php",  async: false }).responseText;
paziek
uh.. asynchronicznie to nie bardzo

Musisz przekazać tą zmienną w onComplete: function(originalRequest) {, czyli tam gdzie ją dostajesz. W sensie - dostałem zmienną, teraz ją użyje! Wywołam sobie funkcje itp. która ją potrzebują właśnie tutaj.

Inaczej możesz zrobić to tak, że zadeklarujesz tą zmienną globalnie (przed tą funkcją getValue() ) i w funkcj, która ma z niej korzystać będziesz sprawdzał czy ta zmienna już jest dostępna za pomocą window.setInterval() ... ale to nie ma dla mnie sensu, skoro możesz mieć podobny efekt robiąc to co napisałem wyżej.

Jest też trzecia metoda - pobieranie AJAX synchroniczny. Wtedy wykonywanie JS się zablokuje do czasu aż pobierze te dane.
qBK
Cytat(paziek @ 15.08.2008, 11:55:12 ) *
uh.. asynchronicznie to nie bardzo

Musisz przekazać tą zmienną w onComplete: function(originalRequest) {, czyli tam gdzie ją dostajesz. W sensie - dostałem zmienną, teraz ją użyje! Wywołam sobie funkcje itp. która ją potrzebują właśnie tutaj.


Coś mniej więcej takiego zrobiłem obchodząc problem, bo żadnych skomplikowanych rzeczy nie musiałem robić, ale chciałem się dowiedzieć czy da się to wykonać inaczej. Dzięki za wskazówki.
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.