Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: W jaki sposób zatrzymać wykonywanie funkcji?
Forum PHP.pl > Forum > Po stronie przeglądarki > JavaScript
b4rt3kk
W jaki sposób zatrzymać wykonywanie funkcji, tzn powiedzmy ze funkcja przyklad(1,2) wykonuje sie z argumentami 1,2 a po kliknieciu w link chcialbym by ta funkcja obecnie wykonywana sie zatrzymala, a uruchomila sie ta sama funkcja tylko ze z innymi argumentami, np. przyklad(2,5). Dodam, ze funkcja przyklad jest funkcja rekurencyjna, ktora w zalozeniu, ma wykonywac sie w nieskonczonosc, tylko ze w zaleznosci od argumentow w inny sposob. A moze istnieje sposob na podawanie na biezaco argumentow dzialajacej juz funkcji?
CuteOne
[JAVASCRIPT] pobierz, plaintext
  1.  
  2. var stop = false;
  3.  
  4. function aaa(arg1, arg2) {
  5.  
  6. if(stop) {
  7. stop = false;
  8. return;
  9. }
  10.  
  11. // właściwy kod funkcji
  12. }
  13.  
  14. aaa(1,2);
  15. stop = true;
  16. aaa(2,5);
[JAVASCRIPT] pobierz, plaintext


flashdev
@CuteOne coś mi się wydaje, że nie o to mu chodzi.

@b4rt3kk prawdopodobnie sam nie potrafi wytłumaczyć o co mu chodzi. Przede wszystkim jak uruchomisz funkcję rekurencyjną to zablokujesz interfejs i kliknięcie w przycisk nawet nie zostanie rozpoznane. Więc z 'zewnątrz' nie jesteś w stanie tego nawet zatrzymać. Chyba że nie będzie to w pełnym tego słowa znaczeniu rekurencja a użyjesz prawidłowo timeout`y.
b4rt3kk
Więc tak, dla jasności, mamy funkcję js:

  1. function costam(nr) {
  2.  
  3. if (nr<10) {
  4. alert(nr);
  5. nr++;
  6. costam(nr);
  7. } else {
  8. nr = 1;
  9. costam(nr);
  10. }
  11.  
  12. }


delaye pomijam, bo mysle ze nie sa tu istota sprawy, natomiast gdy funkcja jest powiedzmy w miejscu gdy nr = 6, a klikne odnosnik o akcji onclick = costam(1) to chcialbym zatrzymac poprzednia funkcje costam, a wystartowac nowa z miejsca 1. Jednak wtedy dzialaja obie naraz.
kilas88
Kod
function costam(nr) {

   if (nr<10) {  
      alert(nr);
      nr++;
      costam(nr);
   } else {
      nr = 1;
      costam(nr);
   }

}


Ten kod zablokuje przeglądarkę, bo zadziała następująco:

costam(6); // zgodnie z Twoim przykładem

1. alert(6);
2. klikasz ok
3. alert(7);
4. klikasz ok
5. alert(8);
6. klikasz ok
7. alert(9);
8. klikasz ok
9. alert(1);
10. klikasz ok
etc...

Wyjaśnij więc może o co Ci chodzi? smile.gif Powyższy kod zablokuje przeglądarkę alertami czy co tam wciśniesz.
CuteOne
Nie wiem w czym widzisz problem...

[JAVASCRIPT] pobierz, plaintext
  1.  
  2. var clicked = false; // ustawia na true podczas klikniecia
  3.  
  4. function cos(nr) {
  5.  
  6. if(nr == 6 && clicked) {
  7.  
  8. clicked = false;
  9. costam(1);
  10. }
  11. elseif(nr < 10 && !clicked) {
  12.  
  13. alert(nr);
  14. nr++;
  15. costam(nr);
  16. }
  17. elseif(nr >= 10) {
  18. nr = 1;
  19. costam(nr);
  20. }
  21. return;
  22. }
[JAVASCRIPT] pobierz, plaintext
b4rt3kk
@CuteOne: owszem, kombinowałem w ten sposób, ale niestety po dodaniu timeotów, funkcja zauważa zmianę zmiennej dopiero po wywołaniu, a ja bym chciał by nastąpiło to natychmiast. Kod HTML wygląda tak:

  1. <input type="hidden" id="curr1" value="1">
  2.  
  3. <ul>
  4. <li id="pointer1"><a href="#" onclick="forceChange = 1">1</a></li>
  5. <li id="pointer2"><a href="#" onclick="forceChange = 2">2</a></li>
  6. <li id="pointer3"><a href="#" onclick="forceChange = 3">3</a></li>
  7. <li id="pointer4"><a href="#" onclick="forceChange = 4">4</a></li>
  8. <li id="pointer5"><a href="#" onclick="forceChange = 5">5</a></li>
  9. <li id="pointer6"><a href="#" onclick="forceChange = 6">6</a></li>
  10. </ul>


natomiast JS:

  1. var forceChange = 0;
  2.  
  3. function carousel1() {
  4.  
  5. timeDelay = 4000;
  6. currentInput = document.getElementById('curr1');
  7.  
  8. if (forceChange != 0) {
  9. currentInput.value = forceChange;
  10. }
  11.  
  12. currentValue = parseInt(currentInput.value);
  13. forceChange = 0;
  14.  
  15. pointerSelected(currentValue);
  16.  
  17. if (currentValue<6) {
  18. currentInput.value = parseInt(currentInput.value)+1;
  19. } else {
  20. currentInput.value = 1;
  21. }
  22.  
  23. window.setTimeout('carousel1();', timeDelay);
  24.  
  25. }


pointerSelected(currentValue) jedynie zmienia nazwy klas, więc kod nie jest potrzebny. Po kliknięciu owszem, karuzela kręci się od danego momentu, jednak zmiana następuje dopiero po kolejnym wywołaniu carousel1() co nastepuje po pewnym opoznieniu okreslonym w timeDelay.
flashdev
Cytat(CuteOne @ 28.09.2011, 13:47:07 ) *
Nie wiem w czym widzisz problem...

[JAVASCRIPT] pobierz, plaintext
  1.  
  2. var clicked = false; // ustawia na true podczas klikniecia
  3.  
  4. function cos(nr) {
  5.  
  6. if(nr == 6 && clicked) {
  7.  
  8. clicked = false;
  9. costam(1);
  10. }
  11. elseif(nr < 10 && !clicked) {
  12.  
  13. alert(nr);
  14. nr++;
  15. costam(nr);
  16. }
  17. elseif(nr >= 10) {
  18. nr = 1;
  19. costam(nr);
  20. }
  21. return;
  22. }
[JAVASCRIPT] pobierz, plaintext


Na ten cytat mogę odpowiedzieć innym cytatem:
Cytat(Douglas Crockford)
java script: The World's Most Misunderstood Programming Language


Prosty przykład.
Kod
var done = false;
setTimeout(function(){
  done = true;
}, 1e3);
while( !done );
alert('done!');


Pojawi się komunikat? Nie pojawi? A może przeglądarka się zawiesi?
pienso
return ?
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.