Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> settimeout nie wywołuje się poprawnie, ciągły bład is not defined
Coyot121
post 24.05.2011, 22:25:38
Post #1





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 11.03.2009
Skąd: Cieszyn

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


Kod
    $("#test").click(function (){loop(4); });
    var i = 0;
    function loop( iHowMany  ){
        
        $("#test").text(i++);
        if ( i < iHowMany ){
            setTimeout("loop( iHowMany )",1000);
        }
    }


w założeniu funkcja ta po naciśnięciu przycisku powinna się powtarzać tak długo dopóki "i" nie będzie mniejsze od 4
Przeszukałem już wiele stron i ciągle nie mogę sobie z tym poradzić. Przy próbie ponownego wywołania funkcji Loop wyskakuje błąd"loop is not defined"

Bardzo proszę o pomoc bo przez to nie mogę kontynuować mojego projektu. ogólnie jako argument będzie podawana tabela z parametrami i po określonym czasie mają one się zmieniać lecz nie mogę przez to przebrnąć
Go to the top of the page
+Quote Post
krowal
post 25.05.2011, 07:07:31
Post #2





Grupa: Zarejestrowani
Postów: 561
Pomógł: 72
Dołączył: 15.11.2006

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


Spróbuj czegoś takiego:
[JAVASCRIPT] pobierz, plaintext
  1. $("#test").click(function (){
  2. loop(4);
  3. });
  4.  
  5. function loop(amount){
  6. this.interval = null;
  7. var i = 0;
  8. this.interval = setInterval(function(){
  9. $('#test').text(++i);
  10. if (i == amount) clearInterval(this.interval);
  11. }, 1000);
  12. }
[JAVASCRIPT] pobierz, plaintext

Sprawdzone, działa.

Ten post edytował krowal 25.05.2011, 07:30:17


--------------------
Nawet świnka może wejść na drzewo kiedy jest chwalona :)
Go to the top of the page
+Quote Post
nospor
post 25.05.2011, 07:28:01
Post #3





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




Błąd który dostajesz jest dziwny. Na mój gust błąd powinien brzmieć
iHowMany is not defined

źle wywołujesz funkcję w setTimeout. Powinno być
setTimeout("loop( "+iHowMany+" )",1000);


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

"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
Coyot121
post 25.05.2011, 09:20:24
Post #4





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 11.03.2009
Skąd: Cieszyn

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


krowal dzięka użyję twojej wersji

nospor pomimo że wywołałem twoim sposobem wciąż wywala mi błąd "loop is nor defined"

Go to the top of the page
+Quote Post
nospor
post 25.05.2011, 09:22:31
Post #5





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




No to nie pokazujesz w takim razie całego kodu bo to ci podałem działa bez problemu


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

"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
krowal
post 25.05.2011, 09:31:39
Post #6





Grupa: Zarejestrowani
Postów: 561
Pomógł: 72
Dołączył: 15.11.2006

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


Jakby nie było, nospor mimo iż nie dał gotowego kodu czym naraził się na pogardę zakładającego temat miał rację z tym, że błąd powinien być taki: 'iHowMany is not defined' a nie ten, który tu wpisałeś wink.gif


--------------------
Nawet świnka może wejść na drzewo kiedy jest chwalona :)
Go to the top of the page
+Quote Post
zegarek84
post 25.05.2011, 10:03:16
Post #7





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

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


Cytat(nospor @ 25.05.2011, 10:22:31 ) *
No to nie pokazujesz w takim razie całego kodu bo to ci podałem działa bez problemu

zadziała bez problemu ale tylko i wyłącznie wtedy, gdy funkcja loop jest zdefiniowana w globalnym zasięgu (czyli pod window), jeśli jednak funkcja jest zagnieżdżona niżej ten sposób nie zadziała (i wtedy window.loop jest nie zdefiniowany ;] - inna sprawa, że pisze samo loop) - poza tym tą metodę nazwałbym niejawnym używaniem eval'a...

na szybko wystarczyło, jeśli wywołanie obudował by w funkcję anonimową i nie jako tekst:
[JAVASCRIPT] pobierz, plaintext
  1. setTimeout(function(){loop( iHowMany );},1000);
[JAVASCRIPT] pobierz, plaintext


jednak jeśli gdzieś dalej on operuje na zmiennej iHowMany a nie chciał, by się zmieniała powinien tą zmienną przekazać jako parametr - czasami na dynamicznym sterowaniu można podmieniać i definicje metod/funkcji - więc funkcję też można przekazać dla pewności przez callback jeśli jej definicja ma się nie zmieniać:
[JAVASCRIPT] pobierz, plaintext
  1. setTimeout(
  2. (function(callback, arg1){
  3. return function(){callback(arg1);callback = arg1 = null;};
  4. })(loop, arg1)
  5. ,1000
  6. );
[JAVASCRIPT] pobierz, plaintext

przypisanie zmiennych do null'a callback = arg1 = null; nie jest konieczne aczkolwiek lepiej zerować nie potrzebne zmienne ze znikającego zasięgu by zapobiec wyciekowi pamięci w niektórych przeglądarkach...

wszystko też zależy, gdzie dana zmienna jest zdefiniowana, od zasięgu i od tego, czy funkcja przyjmuje argumenty - jeśli nie przyjmuje argumentów a operuje na zmiennych z wyższego poziomu to równie dobrze można zapisać bez cudzysłowia:
Kod
setTimeout(callback, 1000);


wszystkie powyższe przypadki są szybsze od niejawnego eval'a i dają możliwość operowania na zagnieżdżonych zmiennych i funkcjach...

Ten post edytował zegarek84 25.05.2011, 10:36: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
nospor
post 25.05.2011, 10:25:21
Post #8





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




Cytat
na szybko wystarczyło, jeśli wywołanie obudował by w funkcję anonimową i nie jako tekst:
[JAVASCRIPT] pobierz, plaintext
setTimeout(function(){loop( iHowMany );},1000);
To się wykona od razu a nie po sekundzie. smile.gif

Co do zasięgu to zapewne masz rację.


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

"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
zegarek84
post 25.05.2011, 10:36:20
Post #9





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

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


Cytat(nospor @ 25.05.2011, 11:25:21 ) *
To się wykona od razu a nie po sekundzie. smile.gif

jak niemal każdy na tym forum znasz firebug'a - wklej sobie to do konsoli i luknij na efekty:
[JAVASCRIPT] pobierz, plaintext
  1. var fLoop = function(sMesage){console.log(sMesage);};
  2. var sTxt = 'Pokażę się po 2s === 2000ms a nie od razu ;]';
  3. setTimeout(function(){fLoop(sTxt);},2000);
[JAVASCRIPT] pobierz, plaintext


ku woli wyjaśnienia - function(){} - to jest deklaracja anonimowej funkcji/obiektu - by się on wykonał od razu należało by zapisać (function(){})()... przy okazji w poście wyżej poprawiam błąd gdyż odruchowo wpisałem przy przekazywaniu argumentów function(){}() zamiast właśnie wspomnianego (function(){})() - co też by zadziałało ale nie na wszystkich przeglądarkach

chociaż nie programuję zawodowo to obiektowość w JS (wraz z dziedziczeniem w prototype [nie piszę o bibliotece] bez wywoływania niepotrzebnych konstruktorów przed deklaracją obiektu) i sam JavaScript raczej znam na wylot

Ten post edytował zegarek84 25.05.2011, 10:44:32


--------------------
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
nospor
post 25.05.2011, 10:43:40
Post #10





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




Spoko maroko, nie denerwuj się. Poprostu szybko spojrzałem i nie zauważyłem, że ty tam wkładasz deklarację anonimowej funkcji smile.gif
function(){....}
Z tą funkcją jest jak najbardziej ok i nie potrzeba mi do tego FireBuga smile.gif


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

"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
Coyot121
post 26.05.2011, 15:16:23
Post #11





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 11.03.2009
Skąd: Cieszyn

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


Kod
$(document).ready(function(){

inne funkcje  nie związane z tym
    
$("#test").click(function (){loop(4); });
    var i = 0;
    function loop( iHowMany  ){
        
        $("#test").text(i++);
        if ( i < iHowMany ){
            setTimeout("loop( iHowMany )",1000);
        }
    }

    
    
});


nic więcej tam nie było,
ps: czemu miałbym kłamać że mi inny komunikat wyskakuje questionmark.gif
finalnie jak mi to zadziałało do funkcji jest przekazywany parametr mówiący jak liczna jest tabela (można to policzyć ale sobie przekazałem), plus tabela ze ścieżkami do zdjęć. W rezultacie uzyskałem to co chciałem czyli zmianę określonych zdjęć przekazanych przez php. i obojętne mi to było jakim sposobem to zrealizuje, tamten mi nie chciał zadziałać więc użyłem tego co działał

finalnie wyszło to tak:
Kod
$(document).ready(function(){

reszta nie związana z tym
    
    $("#again").click(function (){
        location.reload();        
    });
    
    
});
function loop(amount, tab){
      this.interval = null;
      var i = 0;
      this.interval = setInterval(function(){
        
        $('#showimg').attr("src" , tab[i++]);
         if (i == amount){
             $("#again").css('display','block');
             clearInterval(this.interval);
            
         }
        
      },3000);
    }

może nie wygląda to estetycznie i fachowo ale działa więc chwilowo mi wystarczy tongue.gif
wywołanie tego wygląda jeszcze gorzej ale nie znam się jeszcze za dobrze na łączeniu php i javascriptu

Ten post edytował Coyot121 26.05.2011, 15:17:55
Go to the top of the page
+Quote Post
nospor
post 27.05.2011, 06:45:29
Post #12





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




No, czyli funkcję loop definiowałeś lokalnie, dlatego nie była widziana, jakbyś zdefiniował od razu ją globalnie, czyli poza document.ready to byś dostał błąd o którym ja mówiłem wink.gif


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

"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

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: 28.06.2025 - 00:33