Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [JS] Zmienna zwraca undefined
Forum PHP.pl > Forum > Po stronie przeglądarki > JavaScript
Dominator
Dlaczego zmienna IS zwraca mi 'undefined'? Funkcja GetUAnswers() zwraca mi liczbę. Czyli zmienna IS powinna mi zwrócić liczbę, a nie zwraca...

  1. var IS;
  2. setInterval(function(){
  3. IS = GetUAnswers();
  4. }, 1000);
  5.  
  6. alert(IS);
kamil4u
Funkcja IS = GetUAnswers(); wykona się 1s po tym jak wywołujesz alerta. Dlatego zmienna w chwili wyświetlania = undefined
Dominator
Jak temu zapobiec?
Szymciosek
Wywoływać albo getUAnserws na początku skryptu od razu albo opóźnić też wyświetlenie alert.
Dominator
Opóźniłem ten alert... bez pożądanego rezultatu.
Ogólnie rzecz biorąc nie muszę wyświetlać alertu, gdyż tą zmienną IS chcę wyświetlić w divTag.innerHTML = IS; Ale również w tym przypadku jest undefined.

  1. setTimeout(function(){
  2. alert(IS);
  3. },100);
kamil4u
Opóźniłeś o 100ms - funkcja się wykona po 1000ms. Poza tym robisz to źle. Opisz problem dokładniej - co chcesz uzyskać?
Dominator
Cytat(kamil4u @ 20.04.2013, 23:18:41 ) *
Opóźniłeś o 100ms - funkcja się wykona po 1000ms. Poza tym robisz to źle. Opisz problem dokładniej - co chcesz uzyskać?


Wiem, mam spore braki w Javascript.

Co 1000ms ładują mi się zdarzenia na stronie (tzn. ładują się wpisy). Chcę wyświetlić ile ich jest.
Gdy dam na początku $("#ratio").size(); to otrzymam pierwsze 25 zdarzeń, a później gdy minie kolejne 1000ms to tych zdarzeń ma być 50. Wobec tego muszę robić setInterval aby na bieżąco otrzymywać ilość zdarzeń. Gdy nie użyję setInterval to wywołując funkcję, która ma mi zwrócić ilość zdarzeń - otrzymam 25 zamiast 50.
kamil4u
No to wstaw tego alerta co miałeś w pierwszym poście do setIntervala.

Kod
    var IS;
    setInterval(function(){
    IS = GetUAnswers();
    alert(IS);
    }, 1000);


Uwaga: Wstawianie alerta w setInterval to głupi pomysł i może Ci utrudnić korzystanie z przeglądarki. To jedynie przykład. Docelowo wstaw tam innerHTML. Jak chcesz przetestować działanie na alertach to radzę zwiększyć czas na około 5s( tylko do testów )
Dominator
Nie mogę użyj innerHTML w tym, ponieważ co 1000ms będzie mi się tworzyć tekst.
Szymciosek
kamil4you, a nie może on skorzystać z konsoli zamiast alert?

console.log(IS);
Dominator
Cytat(Szymciosek @ 20.04.2013, 23:47:54 ) *
kamil4you, a nie może on skorzystać z konsoli zamiast alert?

console.log(IS);


W konsoli to działa super, tylko muszę użyć zmiennej IS poza tym setInterval.
pyro
http://plugins.jquery.com/postpone/

  1. $.every('1s', 'Twoj alert').progress(function(text){
  2. alert(text); // EDIT: a lepiej console.log(text); ;)
  3. });
Dominator
Wy chyba nie wiecie o co mi chodzi biggrin.gif

Jak użyć zmiennej IS poza tym setInterval abym dostawał liczbę zamiast undefined?

  1. var IS;
  2. setInterval(function(){
  3. IS = GetUAnswers();
  4. console.log(IS); //działa, dostaję liczbę
  5. }, 1000);
  6. console.log(IS); //nie działa, dostaję undefined
pyro
@Dominator, dostałeś odpowiedź dlaczego tak się dzieje, że jest undefined, a ja Ci podałem przykład jak to rozwiązać. Więć właściwie... czego Ty jeszcze chcesz? closedeyes.gif
Dominator
Zrobiłem tak, jak napisałeś i znowu dostaję undefined... facepalmxd.gif
pyro
Pokaż kod - jak będzie sensowny to pooprawię smile.gif
mortus
Dzieje się tak dlatego, że kolejne "komendy" JS wykonywane są niemal równocześnie. Trzeba użyć jakiegoś callback-a. pyro podał Ci link do gotowej biblioteki w jQuery. Prościej można to pokazać w taki sposób:
[JAVASCRIPT] pobierz, plaintext
  1. function myCallback() {
  2. console.log('myCallback: ' + IS);
  3. }
  4. var IS;
  5. setInterval(function(){
  6. IS = GetUAnswers();
  7. console.log('setInterval: ' + IS);
  8. myCallback();
  9. }, 5000);
[JAVASCRIPT] pobierz, plaintext

Na żywo - odpal konsolę i sprawdź.
Jednak postpone z pewnością ma zaimplementowane wszystkie niezbędne funkcjonalności, dlatego warto z tego skorzystać.
viking
Najlepiej zainteresować się tym tematem http://api.jquery.com/category/deferred-object/
Dominator
Powoli, powoli udaje mi się zrobić to, co chcę, ale mam pewien problem:

  1. $.every('1s').progress(function(){
  2. divTag.innerHTML += GetUAnswers();
  3. });


Sprawa wygląda tak, że co 1000ms otrzymuję liczbę, a ona zamiast się aktualizować to ciągle dodaje się do diva. Co zrobić aby ona się nie dodawała, tylko aktualizowała?

Chcę aby to wyglądało tak: "Pytań: 25" - > "Pytań: 50", a nie "Pytań: 2550" (tak jest obecnie).

Wszystkim oczywiście kliknąłem "pomógł", bo na swój sposób mi pomogliście smile.gif
Szymciosek
Dzieje się tak, bo masz tam += czyli do tekstu, który już istnieje on dodaje kolejny.
Dominator
Skrypt teraz działa super smile.gif Lecz gdy dam = zamiast += to mi się usuwa cały tekst z divTag, a zostanie tylko liczba.
Crozin
Skoro zawartość elementu to Pytań: 25, a Ty podmieniasz to wartością 50 oczywistym jest, że wyświetlać będzie się sama liczba. Powinieneś zmieniać samą liczbę, a to najłatwiej osiągnąć przy pomocy dodatkowego tagu HTML:
  1. <p class="total-questions">Pytań: <span class="count">25</span></p>
Zamiast zmieniać zawartość elementu p.total-questions zmieniaj p.total-questions > span.count.
Dominator
Udało mi się smile.gif Dzięki!
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.