Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: setinterval a przekazywanie danych
Forum PHP.pl > Forum > Po stronie przeglądarki > JavaScript
Avatarus
Witam
Próbuje ten skrypt zmusić do zapamiętania ostatnich danych i kontynuowaniu przy następnym intervale, ale nici....możecie doradzić co jest nie tak?
  1. function odliczaj(policz_do,minelo_juz)
  2. {
  3. calosc=policz_do+minelo_juz;
  4. wynik=(minelo_juz/calosc)*100;
  5. rysuj = setInterval('rysowanie('+minelo_juz+','+calosc+','+policz_do+')',1000);
  6. }
  7. function rysowanie(minelo_juz,calosc,policz_do)
  8. {
  9. document.getElementById('licznik').style.width=wynik;
  10. document.getElementById('kontrola1').innerHTML="Policz do: " + policz_do;
  11. document.getElementById('kontrola2').innerHTML="Minęło juz: " + minelo_juz;
  12. document.getElementById('kontrola4').innerHTML="wynik: " + wynik;
  13. document.getElementById('kontrola3').innerHTML=document.getElementById('kontrola3').innerHTML + '<BR>Test';
  14. if((minelo_juz) > calosc)
  15. {
  16. clearInterval(rysuj);
  17. setTimeout('window.location="index.php?metoda=9"', lastms);
  18.  
  19. }
  20. else
  21. wynik =(minelo_juz/calosc)*100;
  22.  
  23.  
  24. }


skrypt działa bo testowe pole kontrola3 cały czas poszerza się o nową linię i słowo Test, ale zmiennie nie chcą się zapamiętać.

Z góry dzięki
nospor
Cytat
ale zmiennie nie chcą się zapamiętać.
Jakie zmienne? To co dla ciebie jest oczywiste bo masz to w głowie to dla nas niekoniecznie...
1) wynik - bo nie zrobiles tej zmiennej globalnie
2) minelo_juz,calosc,policz_do - przeciez setInterval odpala funkcję zawsze z tymi samymi parametrami, wiec nie ma co się dziwic.
Avatarus
no tak, przyznaje że js to dla mnie jeszcze ciężka sprawa.
odpalenie funkcji rysowanie z setinterval, po skończeniu co robi?
i jak zmusić te funkcję żeby updatowała zmienie globalne?
nospor
Cytat
odpalenie funkcji rysowanie z setinterval, po skończeniu co robi?
za sekundę odpala znowu z dokladnie tymi samymi parametrami co za pierwszym razem.

Cytat
i jak zmusić te funkcję żeby updatowała zmienie globalne?
Nie tylko z js masz problem... z polskim też. Pytam się po raz kolejny: o jakie ci zmienne chodzi.
Avatarus
spokojnie bez nerwów smile.gif
jak widać jest funckja
Kod
#
function rysowanie(minelo_juz,calosc,policz_do)
#
{
#
document.getElementById('licznik').style.width=wynik;
#
document.getElementById('kontrola1').innerHTML="Policz do: " + policz_do;
#
document.getElementById('kontrola2').innerHTML="Minęło juz: " + minelo_juz;
#
document.getElementById('kontrola4').innerHTML="wynik: " + wynik;
#
document.getElementById('kontrola3').innerHTML=document.getElementById('kontrola3').innerHTML + '<BR>Test';
#
if((minelo_juz) > calosc)
#
{
#
clearInterval(rysuj);
#
setTimeout('window.location="index.php?metoda=9"', lastms);
#

#
}
#
else
#
wynik =(minelo_juz/calosc)*100;
#

#

#
}

i teraz chciałbym żeby po jej zakończeniu wartość zmiennej wewnątrz niej wzrastał o 1
i przy następnym automatycznym odpaleniu tej funkcji wartość ta była właśnie zwiększona o ten 1.
Dzięki temu funkcja ta będzie robić to co ma robić.

nospor
Cytat
wartość zmiennej wewnątrz niej wzrastał o 1
Wiem, jestem upierdliwy.... ale czy tak ciezko ci napisać nazwę tej zmiennej? Czy ja czy ktoś inny musimy się domyslać o której zmiennej mówisz? Proszę cię o to już trzeci raz. Czy tak trudno to napisać? To jest jakieś magiczne słowo, że jak je napiszesz to się spalisz? smile.gif

ps:
globalną w js robisz przez:
var zmienna;
daj to przed funkcjami.
a potem w funkcji sobie zwiększaj o 1:
zmienna++;
Avatarus
racja, racja.
nie wiem z nerwów gafy robie chyba.

chodzi mi o przekazanie wartości tych 3 zmiennych minelo_juz,calosc,policz_do
chodzi o to że ta funkcja rysowanie(minelo_juz,calosc,policz_do) odpalona przez setinterval robi sobie jakieś tam obliczenia a po skonczeniu ma je zapamiętać, tak żeby po kolejnym odpaleniu mogłą zacząć tam gdzie skończyła.

to działa jak timer.
Z każdą sekundą parametr width diva rośnie o 1 pixel i przez to sprawia wrażenie progress bara czasowego
nospor
NIe wiem po co policz_do - nie ma zadnego uzycia.
"calosc" sobie mozesz przekazywać tak jak to robisz
Zas "minelo_juz" (zakladam ze to ona ma się zwiekszac o 1) zrob z niej zmienną globalną jak ci pisalem w poprzednim poscie w PS.
Moglbys ją przekazywać jako parametr funkcji gdybyś korzystał z setTimeout i na bieżącą aktualizował. W setInterval tak nie mozes zrobic.
Avatarus
zrobiłem tak:
Kod
var wynik;
var minelo_juz;
var policz_do;
var calosc;
function odliczaj(policz_do,minelo_juz)
{
calosc=policz_do+minelo_juz;
rysuj = setInterval('rysowanie('+minelo_juz+','+calosc+','+policz_do+')',1000);
}
function rysowanie(calosc,policz_do)
{
    wynik=(minelo_juz/calosc)*100;
    document.getElementById('licznik').style.width=wynik;
    document.getElementById('kontrola1').innerHTML="Policz do: " + policz_do;
    document.getElementById('kontrola2').innerHTML="Minęło juz: " + minelo_juz;
    document.getElementById('kontrola4').innerHTML="wynik: " + wynik;                                                
     if((minelo_juz) > calosc)
        {                                                                  
          clearInterval(rysuj);                                                                                                                              
          setTimeout('window.location="index.php?metoda=9"', 200);    
     }
     else
      minelo_juz++;     

}

i dalej nie działa.

Kod
var wynik;
var minelo_juz;
var policz_do;
var calosc;
function odliczaj(policz_do,minelo_juz)
{
calosc=policz_do+minelo_juz;
rysuj = setInterval('rysowanie('+calosc+')',1000);
}
function rysowanie(calosc,policz_do)
{
    wynik=(minelo_juz/calosc)*100;    
    document.getElementById('licznik').style.width=wynik;
    document.getElementById('kontrola2').innerHTML="Minęło juz: " + minelo_juz;
    document.getElementById('kontrola4').innerHTML="wynik: " + wynik;                                                
     if((minelo_juz) > calosc)
        {                                                                  
          clearInterval(rysuj);                                                                                                                              
          setTimeout('window.location="index.php?metoda=9"', 200);    
     }
     else minelo_juz++;
      

}

to też nie
nospor
1) var minelo_juz = 0;
2) Inna liczba argumentów funkcji a inna przy jej wywolaniu
3) zainstaluj sobie FireBuga dla FF
4) Masz to gdzieś wystawione?
Avatarus
udało się w końcu, dzięki tobie nospor za co ci jestem wdzięczny.
1) to było to....jedne głupie 0, bez tego w funkcji wywalało błąd NaN

Powstał jednak problem wartości startowych.
Skrypt ignorował zmiennie przekazywane przez odliczaj(), brał wartości globalne poza funkcjami.
Więc zrobiłem to tak że z poziomu PHP są serwowane te zmienne globalne przez wszycie tego pliku js w kod strony a nie linkowanie go jako plik js.
Nie jest to może ładne rozwiązanie, ale działa.

3) mam, i nie wskazywało mi żeby w tej ostatniej wersji był jakiś będy JS (zakładka konsola tak?)
Chyba że tego narzędzia można inaczej użyć.
4) niestety nie mam, lokalnie to sprawdzam.


Dzięki jeszcze raz.
Pozdrawiam
nospor
Cytat
zakładka konsola tak?
Tak. Wydawalo mi się, że błąd co tu miałeś powinien się własnie w konsoli pojawić. No nic, widać tylko mi się wydawało. smile.gif
Avatarus
firebug to fajne narzędzie ale mi raczej przydaje się przy zakładaniu strony, szukaniu błędów i poprawianiu styli.
Przydało by się jak by był w stanie śledzić zmienne js itp.
Fakt faktem że już same wyszukanie błędów js to dużo, ale można więcej.

Gryzie mnie jedna rzecz.
Czemu ta globalność nie jest respektowana przy wywoływaniu funkcji.
Teraz całość wygląda tak

Kod
echo '
            <div id=otoczka>
                <div id=licznik></div>
            </div>
            <div id=kontrola1></div>
            <div id=kontrola2></div>
            <div id=kontrola4></div>
            <div id=kontrola3></div>
            ';
            ?>
            <script type="text/javascript">
var wynik=0;
var minelo_juz=<?php echo (date('U')-$lokacja[start]); ?>;
var policz_do=<?php echo (intval($lokacja[koniec])-date('U')); ?>;
var calosc=0;
function  odliczaj(policz_do,minelo_juz)
{

calosc=policz_do+minelo_juz;
rysuj = setInterval('rysowanie('+calosc+')',1000);
}
function rysowanie(calosc)
{
    wynik=(minelo_juz/calosc)*100;    
    document.getElementById('licznik').style.width=wynik;
    document.getElementById('kontrola2').innerHTML="Minęło juz: " + minelo_juz;
    document.getElementById('kontrola4').innerHTML="wynik: " + wynik;                                                
     if((minelo_juz) > calosc)
        {                                                                  
          clearInterval(rysuj);                                                                                                                              
          setTimeout('window.location="index.php?metoda=9"', 200);    
     }
     else minelo_juz++;
      

}
            <?php
            echo '
            
            odliczaj('.((intval($lokacja[koniec])-date('U'))).','.((date('U')-$lokacja[start])).');</script>';

ciekawi mnie czemu podczas przeładowania strony globalne nadpisują się na takie wartości jakie podam przez funkcjami a nie na to co serwuje skrypt z php

czyli jak przez zmiennymi mam
  1. var wynik=0;
  2. var minelo_juz=0;
  3. var policz_do=0;
  4. var calosc=0;

i wywołam potem funkcje np tak:
  1. odliczaj(10,15)
(dane 10 i 15 podaje php z obliczeń na dacie pobranej z bazy)
to wartości zmiennych nie są odpowiednio 10 i 15 albo 0 i 0 (tak jak by ignorował to co jest w funkcji.
nospor
Cytat
Przydało by się jak by był w stanie śledzić zmienne js itp.
Przecież masz debugowanie kodu linia po linii

Cytat
ciekawi mnie czemu podczas przeładowania strony globalne nadpisują się na takie wartości jakie podam przez funkcjami a nie na to co serwuje skrypt z php
Jesli funkcja ma parametry to w funkcji te parametry są zmiennymi lokalnymi nie mającymi nic wspólnego z globalami. Jakbyś zmienił nazwy parametrów to by wówczas się nie pokrywały z globalami i każde by było tym czym jest smile.gif
Avatarus
aaa no tak...dzięki faktycznie to jest to.
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.