Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [JQUERY] Problem z nawigacja zdjec/slajdow
Volume
post
Post #1





Grupa: Zarejestrowani
Postów: 283
Pomógł: 11
Dołączył: 11.10.2004
Skąd: 3c

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


Witam napisalem sobie taki kod na przerzucanie zdjec i dziala niestabilnie.

Skrypt dziala tak, ze pobiera z id nr i nr ten wskazuje na zrodlo w atrybucie rel ktore jest wyswietalne jako duze.
Stworzylem nawigacje next i back ktora sie zapetla oraz przycisk close do zamkniecia powiekszonego zdjecia.

Problem dokladnie wyglada to tak, ze skrypt dziala w porzadku jesli przerzucam zdjecia do tylu lub do przodu ale w granicach ilosci zdjec od 1 do 4 a jesli cofne z pierwszego zdjecia lub dam do przodu z 4 to skrypt zaczyna wyrzucac zamist zrodla undefined.

Kolejny problem zaczyna sie wtedy gdy uzyje przycisku close - i ponownie wybiore zminiaturek zdjecie do powiekszenia - wtedy nawigacja next i back szwankuje... wywala czasami undefined.

Może ktoś zna lepszy sposob pobierania numeru z wybranego diva (w moim przypadku id="fotx"), np bez użycia atrybutu id?
Ja w tej chwili musze wyciagnac tresc z atrybutu id oraz wyciagnac usuwajac przednie "z" numer, nastepnie formatuje tresc na integer (parseInt) i dopiero moge stosować dzialania +/-.

Bardzo prosze zeby ktos pomogl mi ogarnac problem.

  1. <div id="fotx">
  2. <div id="back">back</div>
  3. <div id="next">next</div>
  4. <div id="close">close</div>
  5. <div id="zdjecia"></div>
  6. </div>
  7. <div id="fotki_big1">
  8. <img id="z1" rel="duze/a.jpg" src="male/a.jpg" alt="zdjecie 1" />
  9. <img id="z2" rel="duze/b.jpg" src="male/b.jpg" alt="zdjecie 2" />
  10. <img id="z3" rel="duze/c.jpg" src="male/c.jpg" alt="zdjecie 3" />
  11. <img id="z4" rel="duze/d.jpg" src="male/d.jpg" alt="zdjecie 4" />
  12. </div>
  13.  
  14. <script type="text/javascript">
  15. $('#fotki_big1 img').click(function ()
  16. {
  17. $('#fotx').css('height', 'auto');
  18. $('#fotx').css('opacity', '1');
  19. var zrodlo=$(this).attr('rel');
  20. var idx=$(this).attr('id');
  21. idx=parseInt(idx.substr(1,2));
  22. $('#zdjecia').html('<div id="zdjecie"><img rel="' + idx + '" src="' + zrodlo + '" alt="zdjecie" />wybrany(id:' + idx + ') (zrodlo:' + zrodlo +')</div>');
  23. //$('#fotx').append(i + '<br /><br />');
  24.  
  25. $('#back').click(function ()
  26. {
  27. var id_aktual=$('#zdjecie img').attr('rel');
  28. var zrodlId=parseInt(id_aktual)-1;
  29. var id_back=$('#z' + zrodlId).attr('rel');
  30. if(idx==1) idx=4;
  31. else idx=parseInt(idx)-1;
  32. $('#zdjecia').html('<div id="zdjecie"><img rel="' + idx + '" src="' + id_back + '" alt="zdjecie" />cofany(id:' + idx + ') (zrodlo:' + id_back +')</div>');
  33. }).css('cursor', 'pointer');
  34.  
  35. $('#next').click(function ()
  36. {
  37. var id_aktual2=$('#zdjecie img').attr('rel');
  38. var zrodlId2=parseInt(id_aktual2)+1;
  39. var id_next=$('#z' + zrodlId2).attr('rel');
  40. if(idx==4) idx=1;
  41. else idx=parseInt(idx)+1;
  42. $('#zdjecia').html('<div id="zdjecie"><img rel="' + idx + '" src="' + id_next + '" alt="zdjecie" />wyprzedzany(id:' + idx + ') (zrodlo:' + id_next +')</div>');
  43. }).css('cursor', 'pointer');
  44.  
  45.  
  46. $('#close').click(function ()
  47. {
  48. $('#fotx').css('height', '0');
  49. $('#fotx').css('opacity', '0');
  50. $('#zdjecia').html('');
  51. }).css('cursor', 'pointer');
  52.  
  53. }).css('cursor', 'pointer');
  54.  
  55. </script>


Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 4)
tolomei
post
Post #2





Grupa: Zarejestrowani
Postów: 450
Pomógł: 135
Dołączył: 18.11.2010
Skąd: Wschowa

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


Witaj.

W Twoim skrypcie celnie zauważyłeś, aby sprawdzać wartość zmiennej idx i korygować ją.
To samo musisz robić ze zmiennymi zrodlId oraz zrodlId2.
Wprowadziłem te zmiany w liniach 14 oraz 24.
Dodatkowo dodałem drugi parametr do wszystkich funkcji parseInt(), gdzie odpowiada on za ustawienie prawidłowego systemu liczbowego. Nam zależy tutaj na systemie dziesiętnym. Najlepiej zawsze podawać ten parametr, aby uniknąć niespodzianek.

Dodatkowo dopowiem, że przy inicjowaniu skryptu powinieneś zliczać wszystkie obrazki, aby nie mieć żadnych statycznych informacji w skrypcie.
Gdybyś na przykład teraz chciał dać 10 obrazków - musiałbyś zmieniać skrypt - dzięki zliczaniu na samym początku - mógłbyś tego uniknąć.

Oto kod:

  1. $(function(){
  2. $('#fotki_big1 img').click(function(){
  3. $('#fotx').css('height', 'auto');
  4. $('#fotx').css('opacity', '1');
  5. var zrodlo=$(this).attr('rel');
  6. var idx=$(this).attr('id');
  7. idx=parseInt(idx.substr(1,2), 10);
  8. $('#zdjecia').html('<div id="zdjecie"><img rel="' + idx + '" src="' + zrodlo + '" alt="zdjecie" />wybrany(id:' + idx + ') (zrodlo:' + zrodlo +')</div>');
  9. //$('#fotx').append(i + '<br /><br />');
  10.  
  11. $('#back').click(function(){
  12. var id_aktual=$('#zdjecie img').attr('rel');
  13. var zrodlId=parseInt(id_aktual, 10)-1;
  14. if(zrodlId==0) zrodlId=4;
  15. var id_back=$('#z' + zrodlId).attr('rel');
  16. if(idx==1) idx=4;
  17. else idx=parseInt(idx, 10)-1;
  18. $('#zdjecia').html('<div id="zdjecie"><img rel="' + idx + '" src="' + id_back + '" alt="zdjecie" />cofany(id:' + idx + ') (zrodlo:' + id_back +')</div>');
  19. }).css('cursor', 'pointer');
  20.  
  21. $('#next').click(function(){
  22. var id_aktual2=$('#zdjecie img').attr('rel');
  23. var zrodlId2=parseInt(id_aktual2, 10)+1;
  24. if(zrodlId2==5) zrodlId2=1;
  25. var id_next=$('#z' + zrodlId2).attr('rel');
  26. if(idx==4) idx=1;
  27. else idx=parseInt(idx, 10)+1;
  28. $('#zdjecia').html('<div id="zdjecie"><img rel="' + idx + '" src="' + id_next + '" alt="zdjecie" />wyprzedzany(id:' + idx + ') (zrodlo:' + id_next +')</div>');
  29. }).css('cursor', 'pointer');
  30.  
  31.  
  32. $('#close').click(function(){
  33. $('#fotx').css('height', '0');
  34. $('#fotx').css('opacity', '0');
  35. $('#zdjecia').html('');
  36. }).css('cursor', 'pointer');
  37.  
  38. }).css('cursor', 'pointer');
  39. });


Demo masz tutaj: http://jsfiddle.net/pqdQz/3/show/
Pełny kod tutaj: http://jsfiddle.net/pqdQz/3/

Pozdrawiam.


--------------------
“ Computers are good at following instructions, but not at reading your mind. ”
- Donald Knuth
Go to the top of the page
+Quote Post
Volume
post
Post #3





Grupa: Zarejestrowani
Postów: 283
Pomógł: 11
Dołączył: 11.10.2004
Skąd: 3c

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


Hej, dzieki faktycznie pominalem te kroki.

Ale pojawia sie jeszcze jeden problem - zobacz w demie, ktore dla mnie zrobiles (http://jsfiddle.net/pqdQz/3/show/), ze jesli damy close i ponownie wybierze sie zdjecie do powiekszenia - zdjecia przelaczane w przod i w tyl sie dziwnie mieszaja - nastepuje przejscie z 2 na 4 itp.
Coś nie moge tego ogarnac - z tego wszystkiego kombinowalem i przy zdarzeniu click - close - czyscilem wszystkei zmienne - ale nie tu lezy problem bo ciagle jest to samo...

Czy moze masz/macie pomysl o co moze jeszcze chodzic?

Ps. co do zliczania obrazkow to robie to przez php - ilosc obrazkow generuje php wiec problem z dopisywaniem recznym skryptu odpada. Chociaż jestem ciekaw jak można zliczać obrazki, bez przypisanych jakis identyfikatorow, jeszcze do tego nie dotarłem w swojej nauce js/jquery.

Ten post edytował Volume 12.04.2012, 15:01:19
Go to the top of the page
+Quote Post
tolomei
post
Post #4





Grupa: Zarejestrowani
Postów: 450
Pomógł: 135
Dołączył: 18.11.2010
Skąd: Wschowa

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


Witaj ponownie smile.gif

Zobacz co się dzieje w Twoim skrypcie:
1. Klikam na miniaturkę 1 i w tym momencie do kliknięć next, back, stop zostają przypisane funkcje obsługujące zdarzenia.
2. Klikam kolejny raz na miniaturkę, lecz teraz na miniaturkę 2. Po raz kolejny do klawiszy next, back, stop zostają przypisane funkcje obsługi zdarzeń.
3. Teraz klikam na przycisk next. Co się dzieje? A to, że zostaje wykonana funkcja stworzona w punkcie 1. i jednocześnie zostaje wykonana funkcja stworzona w punkcie 2.

To oznacza, że za każdym razem, gdy kliknę na miniaturkę - tworzę nową, kolejną funkcję obsługującą to zdarzenie.

Można by zdefiniować obsługę zdarzeń dla przycisków od razu, ale my chcemy mieć klawisze aktywne dopiero po kliknięciu miniaturki. Za to po kliknięciu stop chcemy mieć klawisze nieaktywne.

Zrobimy to tak, że po kliknięciu na miniaturkę sprawdzamy czy istnieje obsługa jakichkolwiek zdarzeń dla pierwszego przycisku(jeśli istnieje dla pierwszego to i dla reszty). Jeśli istnieje to nic nie robimy, jeśli nie istnieje - to przypisujemy zdarzenie. Realizujemy to za pomocą takiego warunku:
  1. if($('#back').data('events') == undefined) {
  2. // dalszy kod
  3. }


Przy kliknięciu na klawisz stop chcemy, aby wszystkie zdarzenia z trzech przycisków zostały usunięte. A więc zmieniamy postać funkcji obsługi zdarzenia:
  1. $('#close').click(function(){
  2. $('#fotx').css('height', '0');
  3. $('#fotx').css('opacity', '0');
  4. $('#zdjecia').html('');
  5. $("#back, #next, #close").unbind().css('cursor', '');
  6. }).css('cursor', 'pointer');


Całość zrealizowana tutaj: http://jsfiddle.net/pqdQz/8/show/
Kod tutaj: http://jsfiddle.net/pqdQz/8/

Pozdrawiam.


--------------------
“ Computers are good at following instructions, but not at reading your mind. ”
- Donald Knuth
Go to the top of the page
+Quote Post
Volume
post
Post #5





Grupa: Zarejestrowani
Postów: 283
Pomógł: 11
Dołączył: 11.10.2004
Skąd: 3c

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


Dzieki, bardzo mi pomogles! Sam chyba długo bym na to nie wpadl...
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 Aktualny czas: 22.08.2025 - 07:38