Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [JavaScript] setTimeOut
Forum PHP.pl > Forum > Przedszkole
Lirdoner
Witam, mam problem z funkcją setTimeOut. Przy takim kodzie
[JAVASCRIPT] pobierz, plaintext
  1. function change(slider) {
  2. alert(slider);
  3. $('.sliderOption').removeClass('active');
  4. $('#slide' + slider).addClass('active');
  5. slider = parseFloat(slider) + 1;
  6. if(slider == 6) { slider = 1; }
  7. setTimeout(change(slider), 3000);
  8. }
  9. change(2);
[JAVASCRIPT] pobierz, plaintext

Dostaję alerty co chwilę mimo że powinny pojawiać się co 3 sekundy. O co może chodzić?
nospor
setTimeout(change(slider), 3000);
Zobacz w manualu js jak sie wywołuje setTimeout bo to co ty teraz robisz to zwykłe odpalenie funkcj z paramettrem
change(slider)
więc nic dziwnego ze odpala ci się od razu...
PrinceOfPersia
musisz podać funkcję jako parametr, bez jej wywołania, o tak:
Kod
setTimeout(change, 3000); // bez nawiasów


tylko w ten sposób Ci się "gubi" informacja o sliderze. Więc musisz użyć sztuczki, np. stworzyć drugą funkcję, która będzie wywoływała tę twoją:
Cytat
setTimeout(function() { change(slider); }, 3000);

function() { .......KOD.........} tworzy funkcję anonimową

jest jeszcze metoda bind i mógłbyś tak napisać:
Kod
setTimeout(change.bind(this, slider), 3000);

ale to nie będzie Ci działać we wszystkich przeglądarkach.
timon27
Cytat(PrinceOfPersia @ 17.04.2013, 19:42:33 ) *
Więc musisz użyć sztuczki


Ja po prostu piszę:
  1. setTimeout("change(slider)", 3000);

i działa.
Trzeba oczywiscie pamiętać że slider bezie pobrany również za 3s a nie natychmiast,
lecz w podanym przykładzie nie ma z tym problemu.
PrinceOfPersia
Cytat
Ja po prostu piszę:
[HTML] pobierz, plaintext
setTimeout("change(slider)", 3000);
[HTML] pobierz, plaintext
i działa.

ależ to prowizorka, czasem działa, czasem nie. (I w tym wypadku nie działa z tego co sprawdzałem). Chodzi o to, że jak podajesz kod w stringu, to żadne zmienne lokalne (zadeklarowane na poziomie funkcji) nie działają. Ani te, które są zadeklarowane po var, ani this, ani argumenty funkcji.
timon27
Cytat(PrinceOfPersia @ 18.04.2013, 10:10:56 ) *
ależ to prowizorka, czasem działa, czasem nie.

Zawsze działa, tylko tak jak mówiłem trzeba zwracać uwagę na zmiennne.

Cytat(PrinceOfPersia @ 18.04.2013, 10:10:56 ) *
żadne zmienne lokalne (zadeklarowane na poziomie funkcji) nie działają

Więc użyj zmiennych globalnych
b4x
Pozwoliłem sobie tongue.gif

Chyba chodzi Tobie o coś takiego:

  1. <head>
  2. <style type="text/css">
  3. .active{display:block !important;}
  4. </style>
  5. <script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
  6. <script type="text/javascript">
  7. var Slider =
  8. {
  9. current: 1,
  10. change: function()
  11. {
  12. $('.sliderOption').removeClass('active');
  13. $('#slide' + Slider.current).addClass('active');
  14.  
  15. Slider.current += 1;
  16.  
  17. if(Slider.current >= 6)
  18. Slider.current = 1;
  19. }
  20. }
  21.  
  22. $(function(){
  23. Slider.change();
  24. setInterval(Slider.change, 3000);
  25. });
  26. </script>
  27. </head>
  28. <body>
  29. <div id="slide1" class="sliderOption" style="display:none;">
  30. 1
  31. </div>
  32. <div id="slide2" class="sliderOption" style="display:none;">
  33. 2
  34. </div>
  35. <div id="slide3" class="sliderOption" style="display:none;">
  36. 3
  37. </div>
  38. <div id="slide4" class="sliderOption" style="display:none;">
  39. 4
  40. </div>
  41. <div id="slide5" class="sliderOption" style="display:none;">
  42. 5
  43. </div>
  44. <div id="slide6" class="sliderOption" style="display:none;">
  45. 6
  46. </div>
  47. </body>
  48. </html>
PrinceOfPersia
@bx4, testowałeś to? Bo tak na oko, to też gubi się kontekst this:
[JAVASCRIPT] pobierz, plaintext
  1. setInterval(Slider.change, 3000);
[JAVASCRIPT] pobierz, plaintext


Cytat
Więc użyj zmiennych globalnych

Nie zawsze się da.

Cytat
Zawsze działa, tylko tak jak mówiłem trzeba zwracać uwagę na zmiennne.

Wolę robić normalnie i nie musieć na nic zwracać uwagę. Poza tym jak robisz normalnie, to masz kolorowanie składni i inne bajery. I masz wszystkie zmienne w JS, możesz też łatwo dać do setTimeouta jakąś większą funkcję. Łatwiej wykrywać błędy. Generalnie same zalety nad hardkodowaniem stringa.
Poza tym hardkodowanie stringa to rozwiązanie z eval, a eval is evil wink.gif
b4x
@PricneOfPersia - tak testowałem smile.gif

http://jsfiddle.net/UHbT8/
PrinceOfPersia
no tak, robisz tam Slider.current, czyli powinno działać smile.gif
(z this.current by raczej nie zadziało wink.gif
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.