Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [JavaScript]Problem z setInterval
Forum PHP.pl > Forum > Przedszkole
Woytek950
Witam. Stworzyłem sobie takie cuś a w nim "funkcja" która jest odpowiedzialna za zmiane przezroczystości. I problem jest w warunku, bo tak jakby go omija. Wiem że setTimeout było by lepsze ale nie potrafję go użyć.
Chcę osiągnąć efekt preoladera.
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
  2. <head>
  3. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
  4. <title>Untitled Document</title>
  5. <script type="text/javascript">
  6.  
  7. var s = 0.01;
  8. var d = 1;
  9. function zs(){
  10. document.cos.style.opacity = s;
  11. document.cos.style.filter = 'alpha(opacity='+d+')';
  12. d++;
  13. s+= 0.01;
  14. document.s.ds.value=d;
  15. }
  16. if (d < 100) {
  17. setInterval("zs(s);", 100);
  18. }
  19. else {}
  20.  
  21. </script>
  22. </head>
  23. <body>
  24.  
  25. <form name="s">
  26. <input type="text" name="ds">
  27. </form>
  28. <br />
  29. <img src="a.jpg" alt="mak polny" name="cos" />
  30.  
  31. </body>
  32. </html>
blooregard
  1. setInterval("zs(s);", 100);

Jak chcesz wywołać f-cję, biorąc jej nazwę w cudzysłowy?
Woytek950
Cytat(blooregard @ 27.04.2010, 13:03:29 ) *
  1. setInterval("zs(s);", 100);

Jak chcesz wywołać f-cję, biorąc jej nazwę w cudzysłowy?


Innaczej się nie da.
blooregard
Cytat
Innaczej się nie da.

Racja, mój błąd.

Ale wywołujesz f-cję zs() z parametrem 's', ale w samej funkcji już go nie obsługujesz nigdzie.
nospor
Kod
setInterval("zs()", 100);

I tak, setTimeout bylby lepszy. Teraz funkcja bedzie ci sie nonstop wywolywac co 100 ms
mortus
Żeby zatrzymać setInterval to dodajesz sobie trzecią zmienną, np.:
var intervalId = 0;
W momencie wywołania funkcji setInterval podpinasz ją do zmiennej intervalId:
intervalId = setInterval("zs()", 100);
i jeśli d nie jest mniejsze od 100 (czyli w bloku else) czyścisz interwał:
clearInterval(intervalId);
nospor
Cytat
i jeśli d nie jest mniejsze od 100 (czyli w bloku else) czyścisz interwał:
Drobna poprawka:
w tym kodzie trzeba to dac w funkcji. Blok IF lezy poza funkcją i jest tylko raz wywolany wiec do else nie dojdzie winksmiley.jpg
mortus
No tak, oczywiście. Opcjonalnie można zmodyfikować nieco funkcję zs(). Mianowicie na końcu dajemy:
[JAVASCRIPT] pobierz, plaintext
  1. if(d == 100) clearInterval(intervalId);
[JAVASCRIPT] pobierz, plaintext
nospor
Cytat
Opcjonalnie można zmodyfikować nieco funkcję zs(). Mianowicie na końcu dajemy:
No wlasnie o tym mowilem w poprzednim poscie, bez zadnego "opcjonalnie" winksmiley.jpg
mortus
Cytat(nospor @ 27.04.2010, 13:28:37 ) *
No wlasnie o tym mowilem w poprzednim poscie, bez zadnego "opcjonalnie" winksmiley.jpg

Przepraszam, źle zrozumiałem Twoją odpowiedź. wstydnis.gif
Woytek950
Cytat(mortus @ 27.04.2010, 13:19:05 ) *
Żeby zatrzymać setInterval to dodajesz sobie trzecią zmienną, np.:
var intervalId = 0;
W momencie wywołania funkcji setInterval podpinasz ją do zmiennej intervalId:
intervalId = setInterval("zs()", 100);
i jeśli d nie jest mniejsze od 100 (czyli w bloku else) czyścisz interwał:
clearInterval(intervalId);

Racja. Zrobiłem tak:
  1. <script type="text/javascript">
  2.  
  3. var s = 0.01;
  4. var intervalId = 0;
  5. var d = 1;
  6.  
  7. function zs()
  8. {
  9. if (d < 100)
  10. {
  11. document.cos.style.opacity = s;
  12. document.cos.style.filter = 'alpha(opacity='+d+')';
  13. d++;
  14. s+= 0.01;
  15. document.s.ds.value=d;
  16.  
  17. intervalId = setInterval("zs()", 1000);
  18. }
  19. else
  20. {
  21. clearInterval(intervalId);
  22. }
  23. }
  24.  
  25.  
  26.  
  27. </script>

Tylko że teraz to liczby przeskakują i coraz szybciej jest.
mortus
Przedtem miałeś dobrze, wystarczyło tylko w odpowiednie miejsca wstawić te trzy podane linie i wyrzucić w ogóle blok else (jak słusznie zauważył nospor).
nospor
bo setInterval nikt ci nie kazal dawac do funkcji. Ma zostac tam gdzie bylo. do funkcji miales dodac tylko clearInterval
Woytek950
Dzięki wielkie yahoo.gif
  1. var s = 0.01;
  2. var intervalId = 0;
  3. var d = 1;
  4.  
  5. function zs(){
  6.  
  7. document.cos.style.opacity = s;
  8. document.cos.style.filter = 'alpha(opacity=' + d + ')';
  9. d++;
  10. s += 0.01;
  11. document.s.ds.value = d;
  12.  
  13. if (d == 100) {
  14. clearInterval(intervalId);
  15. }
  16.  
  17. }
  18. if (d < 100) {
  19.  
  20. intervalId = setInterval("zs()", 50);
  21. }
  22. else {
  23.  
  24. }
zegarek84
Cytat(blooregard @ 27.04.2010, 13:03:29 ) *
  1. setInterval("zs(s);", 100);

Jak chcesz wywołać f-cję, biorąc jej nazwę w cudzysłowy?
Cytat(Woytek950 @ 27.04.2010, 13:05:49 ) *
Innaczej się nie da.
Cytat(blooregard @ 27.04.2010, 13:07:59 ) *
Racja, mój błąd.
jaki błąd blinksmiley.gif questionmark.gif jakie nie da worriedsmiley.gif questionmark.gif
przykład choćby tutaj winksmiley.jpg :
http://forum.php.pl/index.php?s=&showt...st&p=740585
mortus
Cytat(zegarek84 @ 1.05.2010, 02:56:51 ) *
jaki błąd blinksmiley.gif questionmark.gif jakie nie da worriedsmiley.gif questionmark.gif
przykład choćby tutaj winksmiley.jpg :
http://forum.php.pl/index.php?s=&showt...st&p=740585

@zegarek84 Może warto by było wyjaśnić, dlaczego się da i kiedy się nie da, a nie tylko stwierdzać niepełne fakty.

A nie da się wtedy, kiedy funkcja posiada jakieś argumenty (czyli musimy użyć nawiasów (), aby te argumenty podać). Dla funkcji przedstawionej na początku przez Woytek950 się nie dało.
zegarek84
ZAWSZE SIĘ DA biggrin.gif
a może pasowało by przeczytać cały temat i zajrzeć co tam jest napisane w tym linku??
ale ok...
Da się zawsze wtedy gdy jako argument do setInterval podajemy nazwę funkcji bez nawiasów (wtedy nie może to być jako tekst...)...

W podanym linku wspomnialem o pewnej możliwości o której też pisalem by zapomnieć gdyż działa tylko na operze i mozilli - a mianowicie kolejne argumenty powyżej drugiego dla funkcji setInterval są argumentami funkcji wywoływanej [NIE STOSOWAĆ - ZAPOMNIJCIE, ŻE O TYM PISAŁEM!!!], a jest jeszcze jeden sposób którego nie stosować bo nie działa na IE, a mianowicie jako pierwszy argument funkcja anonimowa czyli function(){bleble...}...

JAK PRZEKAZAĆ ARGUMENTY FUNKCJI?? - oto jest pytanie gdzie była zawarta odpowiedź i przykład [a raczej rozwiązanie tamtego tematu] w podanym wcześniej prze zemnie linku... odpowiedź jest banalna i działa na wszystkich przeglądarkach, a mianowicie wystarczy poczytać o zasięgu zmiennych w JavaScript, o zmiennych prywatnych i globalnych... ustawiamy gdzieś zmienne jakie potrzebne są w ciele funkcji poza nią w hierarchii wyżej by zmienne były widoczne w wykonywanej funkcji... odpalamy funkcje i wszystko chodzi i hula - prosty przykład w podanym linku winksmiley.jpg -> i dokładnie w taki sam sposób przekazuje się te zmienne do funkcji w jaki przekazaliście powyżej zmienną intervalId tongue.gif biggrin.gif

a bardziej złożone rozwiązanie przy hermetyzacji z setTimeout lub także z setInterval jest w temacie:
[jQuery] Snake, Wężyk z prostą grafą. - w dalszej części tego tematu ciąg tekstowy został zastąpiony funkcją... i jest tam napisane, iż jeśli korzystamy z ciągu tekstowego to to nas mocno ogranicza gdyż dana funkcja musi być dostępna i mieć podaną ścieżkę z globalnego obiektu window....

[EDIT]
skoro został tutaj nawiązany dzisiaj deczko inny aspekt i akurat dzisiaj padło konkretniejsze pytanie tyczące się tego aspektu w innym temacie na forum daję jeszcze link do tegoż pytania dotyczącego funkcji setTimeout i setInterval [nie każdy musi od razu zrozumieć - ważne, że są przykłady i, że kiedyś może się przydać]:
http://forum.php.pl/index.php?s=&showt...st&p=741983
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.