Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [JavaScript] Wywoływanie wielokrotnie jednej funkcji
innowwwacje
post
Post #1





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 21.08.2008
Skąd: Warszawa

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


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.
Go to the top of the page
+Quote Post
Spawnm
post
Post #2





Grupa: Moderatorzy
Postów: 4 069
Pomógł: 497
Dołączył: 11.05.2007
Skąd: Warszawa




ajax daje taką możliwość -> poczytaj o synchronicznym i asynchronicznym działaniu (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
innowwwacje
post
Post #3





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 21.08.2008
Skąd: Warszawa

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


Rozumiem co znaczy synchroniczne i asynchroniczne działanie, ale nie bardzo potrafię skojarzyć to z moim problemem...
Go to the top of the page
+Quote Post
wookieb
post
Post #4





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Opisz dokładniej problem.
Pokaż kod. Podaj przykład działania.
Go to the top of the page
+Quote Post
Spawnm
post
Post #5





Grupa: Moderatorzy
Postów: 4 069
Pomógł: 497
Dołączył: 11.05.2007
Skąd: Warszawa




odwołujesz się do funkcji przez ajax , tak aby się dane nie nakładały (funkcje będziesz dawał w osobnym pliku)
Go to the top of the page
+Quote Post
innowwwacje
post
Post #6





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 21.08.2008
Skąd: Warszawa

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


Sugerujesz, że wywołanie funkcji ma się odbyć przez zapytanie ajaxowe do serwera?
Go to the top of the page
+Quote Post
Spawnm
post
Post #7





Grupa: Moderatorzy
Postów: 4 069
Pomógł: 497
Dołączył: 11.05.2007
Skąd: Warszawa




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
Go to the top of the page
+Quote Post
revyag
post
Post #8





Grupa: Przyjaciele php.pl
Postów: 2 258
Pomógł: 16
Dołączył: 21.09.2004
Skąd: Kielce

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


@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();
Go to the top of the page
+Quote Post
innowwwacje
post
Post #9





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 21.08.2008
Skąd: Warszawa

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


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...

Ten post edytował innowwwacje 17.03.2009, 12:36:37
Go to the top of the page
+Quote Post
wookieb
post
Post #10





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




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.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 21:45