[jQuery] Jak w JS odwołać się do zmiennej zadeklarowanej wewnątrz jQuery ?

0

Witam
Pytanie jak w temacie.
Chciałbym wykorzystać zmienną zadeklarowaną w jQuery w dalszej części dokumentu w skryptach JS.
Próbowałem deklarować ją jako globalną przez "window" ale nic to nie dało.
Pięknie proszę o pomoc.

0

Źle postawione pytanie. Na pewno nie masz tam "zmiennej zadeklarowanej w jQuery", cokolwiek to nie znaczy.

Pokaż kod.

Zmienną globalną można zadeklarować poprzez window i będzie to działało dokładnie tak, jak to napiszesz: będzie istniała jedna zmienna globalna o podanej nazwie. Nie trzeba nawet używać window. Wystarczy, że w kodzie na najwyższym poziomie -- tj. nie w jakiejś funkcji -- napiszesz var mojaZmienna, a potem, już np. wewnątrz funkcji, po prostu będziesz do niej przypisywał wartość (nie używając już var), czyli mojaZmienna = 5.

0
<script type="text/javascript">

var zmienna;

$.ajax({
  type: "POST",
  url: "files.php",
  success: function(dane)
  {
     zmienna = $.parseJSON(dane);
  }
});

alert(zmienna);

</script>

Jakbym nie definiował tej zmiennej czy to jako tablica (czym w zamyśle jest) czy ciąg, czy to na zewnątrz funkcji jak wyżej czy za pomocą "window" wewnątrz funkcji, zmienna nie zmienia wartości (W tym wypadku pozostaje undefined). Gdy umieszczę funkcję "alert" wewnątrz funkcji napisanej w jQuery wszystko jest OK.

4

Nieprawda, na zewnątrz funkcji Twoja zmienna też jest aktualizowana. Po prostu próbujesz wyświetlić jej wartość ZANIM jeszcze zostanie zaktualizowana.

Żądania ajaxowe wysyłane są asynchronicznie. Działa to tak, że w wywołaniu $.ajax mówisz "wyślij teraz żądanie typu POST do files.php, ale nie czekaj na odpowiedź, tylko leć dalej z kolejnymi linijkami kodu; gdy odpowiedź przyjdzie, odpal mi funkcję success".

Najpierw deklarujesz zmienną zmienna, której domyślną wartością jest undefined. Następnie wykonuje się funkcja $.ajax() z obiektem przekazanym jako parametr. Przekazujesz tam m.in. funkcję w polu success -- funkcja ta zostanie odpalona, gdy serwer odpowie, czyli może np. za kilka sekund. Ale jeszcze nie teraz, teraz leci tylko funkcja $.ajax(), która tylko wysyła żądanie. Następnie wyświetlana jest wartość zmiennej zmienna -- i jest tam nadal undefined, bo na nic innego jej nie ustawiliśmy (!). Kończy się wykonywać kod w tagu <script>. Ten kod w funkcji $.ajax() wysłał na serwer asynchronicznę żądanie. Po kilku sekundach (lub milisekundach ;-)), przychodzi odpowiedź. jQuery, zgodnie z Twoją prośbą, wywołuje funkcję, którą przekazałeś funkcji $.ajax() w polu success. W tym momencie ustawiasz wartość zmiennej na wartość obiektu JSON, który przyszedł jako odpowiedź. I dalej nic nie robisz.

Jak widzisz, wyświetliłeś wartość zmiennej jeszcze zanim jej tę wartość nadałeś. Myślałeś,że $.ajax() jest wykonywane synchroniczne, tj. że funkcja wysyła żądanie i czeka, aż ono przyjdzie -- blokując wywoływanie dalszego kodu. Myślałeś, że dopiero jak przyjdzie odpowiedź, to funkcja $.ajax() skończy działanie, odpali funkcję z pola success i zostanie wykonany dalszy kod, czyli alert. Tak jednak nie jest.

W asynchronicznym wywołaniu nie blokujemy dalszego kodu. Odpalamy funkcję, która rozpoczyna jakąś akcję i nie czeka na jej zakończenie. Funkcja $.ajax() wysyła żądanie i nie czeka na odpowiedź.

I bardzo dobrze. Gdyby czekała, blokowałaby przeglądarkę na kilka sekund. Przeglądarka zaliczyłaby tzw. "freeze'a".

Póki co myśl sobie w ten sposób: za funkcją $.ajax() nie umieszczaj żadnego kodu, który ma zostać wykonany po przyjściu odpowiedzi. To, co ma zostać wykonane po przyjściu odpowiedzi, wykonaj w funkcji w polu success.

Aha: da się sprawić, by funkcja $.ajax() zachowywała się synchronicznie, czyli bardziej intuicyjnie. Wystarczy ustawić opcję async na false. Ale ZDECYDOWANIE NIE NALEŻY TEGO ROBIĆ, ponieważ totalnie zablokuje to przeglądarkę od momentu wysłania aż do przyjścia żądania, co może trwać wiele sekund. Przez ten czas nie będzie można scrollować zawartości, przełączać się na inną kartę itd. Siła JavaScriptu polega na wywołaniach asynchronicznych i polecam się ich nauczyć, nawet jeśli wydają się początkowo nieintuicyjne. Tak po prostu trzeba robić, nie ma innej drogi.

0
// tworzysz zmienną
var zmienna;
 
// wywołujesz w przeglądarce requesta (nieblokującego) który może wykonać się w dowolnym momencie
$.ajax({
  type: "POST",
  url: "files.php",
  success: function(dane)
  {
     zmienna = $.parseJSON(dane);
  }
});
 
// wyświetlasz zmienną, która nie zdążyła jeszcze być zmieniona w callbacku success
alert(zmienna);

// jak zrobisz tak, to zakładając że request wykona się w ciągu 2 sekund, to powinieneś zobaczyć wynik
setTimeout(function(){alert(zmienna);},2000);</script>
0

Dzięki za wyczerpującą odpowiedź.

1 użytkowników online, w tym zalogowanych: 0, gości: 1