Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [JavaScript] Wywoływanie wielokrotnie jednej funkcji
Forum PHP.pl > Forum > Przedszkole
innowwwacje
W jaki sposób umożliwić skryptom wielokrotne jednoczesne korzystanie z danej funkcji?



Tradycyjne definiowanie funkcji na zasadzie function cos_tam (id) powoduje, że gdy funkcja nie zostanie zakończona i inny element będzie się do niej odwoływał, pierwsze wywołanie zostanie niejako anulowane. Być może nadpisywane są zmienne funkcji, a może coś innego.
Spawnm
ajax daje taką możliwość -> poczytaj o synchronicznym i asynchronicznym działaniu smile.gif
innowwwacje
Rozumiem co znaczy synchroniczne i asynchroniczne działanie, ale nie bardzo potrafię skojarzyć to z moim problemem...
wookieb
Opisz dokładniej problem.
Pokaż kod. Podaj przykład działania.
Spawnm
odwołujesz się do funkcji przez ajax , tak aby się dane nie nakładały (funkcje będziesz dawał w osobnym pliku)
innowwwacje
Sugerujesz, że wywołanie funkcji ma się odbyć przez zapytanie ajaxowe do serwera?
Spawnm
Cytat(innowwwacje @ 17.03.2009, 09:28:00 ) *
Sugerujesz, że wywołanie funkcji ma się odbyć przez zapytanie ajaxowe do serwera?

chyba tak , trochę strzelam ;]

najlepiej zrób jak powiedział wookieb
revyag
@innowwwacje
Zrób obiekt.
Kod
function obj() {
    var obj = new Object();
    
    obj.zmienna = '';

    obj.jakasFunkcja = function() {
         alert(obj.zmienna);
    }
    
    return obj;
}

var a = new obj();
var b = new obj();
a.zmienna = 'Zmienna a';
b.zmienna = 'Zmienna b';

a.jakasFunkcja();
b.jakasFunkcja();
innowwwacje
Wydaje mi się, że wywoływanie za każdym razem funkcji z serwera to będzie sieczka dla wydajności.

Już opisuję szerzej problem. Ostatni mój temat dotyczył problemu poprawnego interpretowania zdarzenia onmouseout. Gdy div miał wewnątrz diva z tabelą z ikonami poruszanie kursorem w obrębie diva wywoływało nieproszenie funkcję onmouseout. Napisałem sobie funkcje, która ma sprawdzać położenie kursora względem diva. Jeżeli kursor znajduje się w obrębie diva z ikonami ma go nie chować.

Mamy tabelę z listą dodanych kategorii. Po prawej stronie od każdego rekordu do tej pory była lista ikon funkcyjnych (dodaj, usuń, przesuń w górę itp.). W momencie kiedy tych ikon zaczęło przybywać, ergonomia obniżała się. Wpadłem na pomysł, by stworzyć jedną ikonę, która po umieszczeniu na niej kursora myszy pokazywałaby po lewej stronie od niej ikony funkcyjne dotyczące danej kategorii. Tutaj wszystko działa poprawnie.

Mam taką funkcję:
  1. function narzedzia_schowaj ( id )
  2. {
  3. this.id = id;
  4.  
  5. var pozycja = findPos($('narzedzia_ikony_' + id));
  6.  
  7. var szerokosc = $( 'narzedzia_wnetrze_' + id ).offsetWidth;
  8. var wysokosc = $( 'narzedzia_wnetrze_' + id ).offsetHeight;
  9.  
  10. var poczatek_x = pozycja[0];
  11. var koniec_x = pozycja[0]+szerokosc;
  12. var poczatek_y = pozycja[1];
  13. var koniec_y = pozycja[1]+wysokosc;
  14.  
  15. if ( tempX < poczatek_x || tempX > koniec_x || tempY < poczatek_y || tempY > koniec_y )
  16. {
  17. mint.fx.Fade( 'narzedzia_ikony_' + id, 0, 30, 400 );
  18.  
  19. czas_ukrywania_narzedzi = setTimeout ( "$('narzedzia_ikony_' + id).style.display = 'none';", 600 );
  20. }
  21. else
  22. {
  23. setTimeout("narzedzia_schowaj ( id ) ", 200);
  24. }
  25. }

Zdarzenie onmouseout wywoływane jest czasem na ostatnim pikselu poza elementem podczas zdejmowania kursora z diva. W związku z tym jest timeout, który sprawdza, czy faktycznie kursor jest poza divem. W ten sposób ikonki znikają tylko wtedy, gdy kursor fizycznie znajduje się poza ich obszarem.

W momencie kiedy operuję na jednej ikonie tzn. umieszczam na niej kursor po czym go zdejmuję wszystko działa poprawnie.

Całość wyświetlana jest w liście (kategoria pod kategorią itd.). Tak więc ikony są w kolumnie pod sobą. Kiedy przejadę kursorem wzdłuż ikon z pierwszej szybko na drugą, a potem na trzecią i potem dopiero zdejmę kursor myszy z ikony trzeciej, funkcja znikania ikon wywoływana jest tylko dla tej ostatniej.

Wygląda to tak jakby funkcja mogła być używana jednocześnie w jednym czasie tylko raz. Kiedy przed jej zakończeniem wywoływana jest drugi raz, pierwsze wywołanie zostaje anulowane.

@revyag

No niby tak tylko rzecz polega na tym, że te obiekty miałyby być tworzone z automatu dla nieograniczonej ilości elementów generowanych dynamicznie, a nie dla jednego konrketnego...
wookieb
Nie wiem czy do konca dobrze zrozumialem.
Ale może zrób coś takiego, że w momencie najechania na ikone zapisujesz sobie czas najechania na nia.
Nastepnie jezeli chcesz ukryc ikone to sprawdzasz czy inne nieukryte moga zostac schowane (sprawdzasz roznice czasow) i je wtedy ukrywasz.
Jak to zrobic?
Dla kazdej ikony tworzysz obiekt ja obsługujacy. A w oddzielnej tablicy przechowujesz liste obiektow dla kazdej ikony. Przy ukryciu przelatujesz liste obiektow i sprawdzasz czy mozna ukryc. To jest takie moje zalozenie i tylko propozycja.
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.