Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [JavaScript]Problem z setInterval
Woytek950
post 27.04.2010, 11:58:37
Post #1





Grupa: Zarejestrowani
Postów: 130
Pomógł: 2
Dołączył: 6.06.2008
Skąd: jesteś ?

Ostrzeżenie: (0%)
-----


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>
Go to the top of the page
+Quote Post
blooregard
post 27.04.2010, 12:03:29
Post #2


Newsman


Grupa: Moderatorzy
Postów: 2 033
Pomógł: 290
Dołączył: 21.12.2007
Skąd: Łódź




  1. setInterval("zs(s);", 100);

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


--------------------
Life's simple... You make choices and don't look back...
Go to the top of the page
+Quote Post
Woytek950
post 27.04.2010, 12:05:49
Post #3





Grupa: Zarejestrowani
Postów: 130
Pomógł: 2
Dołączył: 6.06.2008
Skąd: jesteś ?

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
blooregard
post 27.04.2010, 12:07:59
Post #4


Newsman


Grupa: Moderatorzy
Postów: 2 033
Pomógł: 290
Dołączył: 21.12.2007
Skąd: Łódź




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.
Powód edycji: [blooregard]:


--------------------
Life's simple... You make choices and don't look back...
Go to the top of the page
+Quote Post
nospor
post 27.04.2010, 12:10:06
Post #5





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Kod
setInterval("zs()", 100);

I tak, setTimeout bylby lepszy. Teraz funkcja bedzie ci sie nonstop wywolywac co 100 ms


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
mortus
post 27.04.2010, 12:19:05
Post #6





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

Ostrzeżenie: (0%)
-----


Ż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);
Go to the top of the page
+Quote Post
nospor
post 27.04.2010, 12:20:33
Post #7





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
mortus
post 27.04.2010, 12:27:05
Post #8





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

Ostrzeżenie: (0%)
-----


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


Ten post edytował mortus 27.04.2010, 12:27:37
Go to the top of the page
+Quote Post
nospor
post 27.04.2010, 12:28:37
Post #9





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
mortus
post 27.04.2010, 12:31:19
Post #10





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
Woytek950
post 27.04.2010, 12:31:52
Post #11





Grupa: Zarejestrowani
Postów: 130
Pomógł: 2
Dołączył: 6.06.2008
Skąd: jesteś ?

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
mortus
post 27.04.2010, 12:35:50
Post #12





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

Ostrzeżenie: (0%)
-----


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).
Go to the top of the page
+Quote Post
nospor
post 27.04.2010, 12:36:14
Post #13





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




bo setInterval nikt ci nie kazal dawac do funkcji. Ma zostac tam gdzie bylo. do funkcji miales dodac tylko clearInterval


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Woytek950
post 27.04.2010, 12:41:06
Post #14





Grupa: Zarejestrowani
Postów: 130
Pomógł: 2
Dołączył: 6.06.2008
Skąd: jesteś ?

Ostrzeżenie: (0%)
-----


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. }
Go to the top of the page
+Quote Post
zegarek84
post 1.05.2010, 01:56:51
Post #15





Grupa: Zarejestrowani
Postów: 1 332
Pomógł: 294
Dołączył: 12.10.2008
Skąd: Olkusz

Ostrzeżenie: (0%)
-----


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


--------------------
Jeśli twoja ręka rusza do przodu powstrzymaj swój gniew; gdy wyprzedza cię twój gniew - wycofaj rękę.

Go to the top of the page
+Quote Post
mortus
post 1.05.2010, 07:21:33
Post #16





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
zegarek84
post 1.05.2010, 09:32:04
Post #17





Grupa: Zarejestrowani
Postów: 1 332
Pomógł: 294
Dołączył: 12.10.2008
Skąd: Olkusz

Ostrzeżenie: (0%)
-----


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

Ten post edytował zegarek84 1.05.2010, 11:41:53


--------------------
Jeśli twoja ręka rusza do przodu powstrzymaj swój gniew; gdy wyprzedza cię twój gniew - wycofaj rękę.

Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 13.06.2025 - 10:10