Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Dodanie sleepów
Forum PHP.pl > Forum > Po stronie przeglądarki > JavaScript
creif
Witam, mam pewien javascript

Kod
$(document).keyup(function(e){
  if(e.which==69){
    for(var i in g.npc){
      if ((Math.abs(hero.rx - g.npc[i].x) <= 1 && Math.abs(hero.ry - g.npc[i].y) <= 1) && (g.npc[i].type == 2 || g.npc[i].type == 3)){
        message('id: "'+g.npc[i].nick+'"');
        _g("reg&a=name&auto=1&id=-"+i);
        break;
      }
    }
  }
});


Funkcja wykonuje się przy naciskaniu klawisza "E", chciałbym, by raz po naciśnięciu klawisza E, do następnego wykonania funkcji trzeba było odczekać 5000 milisekund, czyli nawet gdy naciskamy powtarzalnie klawisz "E", to funkcja wykona się tylko raz na 5000 milisekund

Kombinowałem na różne sposoby z setTimeout, ale nie udało się.

Chciałoby się komuś pomóc? dzięki tongue.gif
kamil4u
To się robi tak:
- tworzysz zmienną globalną zwaną flagą
- w chwili kliknięcia ustawiasz flagę na true
- przed wywołaniem funkcji sprawdzasz czy flaga == false, jeżeli nie to funkcji nie wywołujesz
- na końcu wywoływanej funkcji zmieniasz z powrotem flagę na false

W Twoim przypadku ustawiasz setTimeout przy ostatnim punkcie.
W razie wątpliwości pytaj.
creif
Kompletnie nie znam się na javascript, zrobiłem coś takiego według twojego opisu, jednak nie działa :

Kod
$(document).keyup(function(e){
  if(e.which==69 && flaga==false){
   var flaga==true;
    for(var i in g.npc){
      if ((Math.abs(hero.rx - g.npc[i].x) <= 1 && Math.abs(hero.ry - g.npc[i].y) <= 1) && (g.npc[i].type == 2 || g.npc[i].type == 3)){
        message('id: "'+g.npc[i].nick+'"');
        _g("reg&a=name&auto=1&id=-"+i);
        break;
        setTimeout(function(){flaga==false;}, 5000);
      }
    }
  }
});


Chciałoby ci się poprawić?
longinus_torwaldzki
hej,

w nie wiem czy w js jest cos takiego jak zmienne globalne... mozesz przypisac flage do obiektu window na przykład, sproboj tak...

Kod
$(document).keyup(function(e){
  if(e.which==69 && window.flaga==false){
   window.flaga=true; //<<-- tutaj miales blad
    for(var i in g.npc){
      if ((Math.abs(hero.rx - g.npc[i].x) <= 1 && Math.abs(hero.ry - g.npc[i].y) <= 1) && (g.npc[i].type == 2 || g.npc[i].type == 3)){
        message('id: "'+g.npc[i].nick+'"');
        _g("reg&a=name&auto=1&id=-"+i);
        break;
        setTimeout(function(){window.flaga=false;}, 5000);//<<-- i tutaj
      }
    }
  }
});


ps. poza tym dopatrzyelm sie 2 bledow w kodzie.
creif
Nie działa niestety :/ ale dzięki bardzo za starania.
Dałoby radę coś jeszcze zrobić?
kamil4u
Tak istnieją zmienna globalne, które działają na podobnej zasadzie, którą opisałeś, tyle że w skrócie zapisuje się to tak:
Kod
var test1; <-- zmienna globalna
function testA( test2 ){ <-- zmienna lokalna( jako argument funkcji )
var test3;  <-- zmienna lokalna( var w funkcji )
}

var test4;
function testB(){
test4 = 'test';  <-- zmienna globalna
}


[JAVASCRIPT] pobierz, plaintext
  1. var flaga = false;
  2. $(document).keyup(function(e){
  3. if(e.which==69 && flaga==false){
  4. flaga=true; //<<-- tutaj miales blad
  5. for(var i in g.npc){
  6. if ((Math.abs(hero.rx - g.npc[i].x) <= 1 && Math.abs(hero.ry - g.npc[i].y) <= 1) && (g.npc[i].type == 2 || g.npc[i].type == 3)){
  7. message('id: "'+g.npc[i].nick+'"');
  8. _g("reg&a=name&auto=1&id=-"+i);
  9. break;
  10. setTimeout(function(){ flaga=false; }, 5000);//<<-- i tutaj
  11. }
  12. }
  13. }
  14. });
[JAVASCRIPT] pobierz, plaintext


--edit--
Jak nie działa pokaż co "wypluwa" konsola błędów, a najlepiej daj przykład live

--edit2--
http://jsfiddle.net/tGNVF/
longinus_torwaldzki
no albo jakby cos to to tez powinno zadzialac...
Kod
$(document).ready(function(){
window.flaga=false
$(document).keyup(function(e){
    
  if(e.which==69 && window.flaga==false){

   window.flaga=true; //<<-- tutaj miales blad
    
    for(var i in g.npc){
      if ((Math.abs(hero.rx - g.npc[i].x) <= 1 && Math.abs(hero.ry - g.npc[i].y) <= 1) && (g.npc[i].type == 2 || g.npc[i].type == 3)){
        message('id: "'+g.npc[i].nick+'"');
        _g("reg&a=name&auto=1&id=-"+i);
        break;
        setTimeout(function(){window.flaga=false;}, 5000);//<<-- i tutaj
      }
    }
  }
})
})
creif
To będzie trochę dziecinne co powiem, ale chłopie kocham cie biggrin.gifD jesteśmy na dobrej drodze, wszystko hula tylko jest jedna rzecz do zmiany.
Już tłumacze o co chodzi, w tym momencie funkcja jest "pauzowana" na 5000 milisekund po każdym naciśnięciu E, musi być pauzowana jedynie w wypadku gdy wykonana zostanie do końca, czyli gdy wykonany zostanie ten element:

Kod
if ((Math.abs(hero.rx - g.npc[i].x) <= 1 && Math.abs(hero.ry - g.npc[i].y) <= 1) && (g.npc[i].type == 2 || g.npc[i].type == 3)){
        message('id: "'+g.npc[i].nick+'"');
        _g("reg&a=name&auto=1&id=-"+i);


Próbowałem sam przerobić i zrobiłem tak :

Kod
var flaga = false;
$(document).keyup(function(e){
  if(e.which==69){
    for(var i in g.npc){
      if ((Math.abs(hero.rx - g.npc[i].x) <= 1 && Math.abs(hero.ry - g.npc[i].y) <= 1) && (g.npc[i].type == 2 || g.npc[i].type == 3) && flaga==false){
        _g("reg&a=name&auto=1&id=-"+i);
            message('id: "'+g.npc[i].nick+'"');
            flaga=true;
        break;
        setTimeout(function(){ flaga=false; }, 5000);
      }
    }
  }
});


Zadziałało, ale tylko za pierwszym razem, następnie funkcja jakby się "zakopała" i już nic się nie dzieje po naciskaniu E biggrin.gif
kamil4u
[JAVASCRIPT] pobierz, plaintext
  1. var flaga = false;
  2. $(document).keyup(function(e){
  3. if(e.which==69){
  4. flaga=true;
  5. for(var i in g.npc){
  6. if ((Math.abs(hero.rx - g.npc[i].x) <= 1 && Math.abs(hero.ry - g.npc[i].y) <= 1) && (g.npc[i].type == 2 || g.npc[i].type == 3) && flaga==false){
  7. _g("reg&a=name&auto=1&id=-"+i);
  8. message('id: "'+g.npc[i].nick+'"');
  9. setTimeout(function(){ flaga=false; }, 5000);
  10. break;
  11. }
  12. }
  13. }
  14. });
[JAVASCRIPT] pobierz, plaintext
?
creif

Edit:
DZIAŁA, SKASOWAŁEM BREAK.

BARDZO DZIĘKUJĘ ZA POMOC WSZYSTKIM, SZCZEGÓLNIE @kamil4u

Pozdrawiam!

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.