Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [jQuery] Prosta galeria
Forum PHP.pl > Forum > Po stronie przeglądarki > JavaScript
wdev
Witam,

Uczę się jQuery i stwierdziłem, że zrobię prostą galerię jako moduł do Joomli. Założenie - jeden obrazek, na dole miniaturki i po naciśnięciu zmieniają główny. Nie wiem, co robię źle, ale jQuery zamiast zadziałać .click, w ogóle się nie odzywa. Pomoże ktoś znaleźć błąd?

  1. (function($){
  2. $('#jgallery_image_thumbs a').click(function(){
  3. var mainPath = $(this).attr('href');
  4. var mainAlt = $(this).attr('title');
  5.  
  6. $('#jgallery_main_image img').attr({ src: mainPath, alt: mainAlt });
  7. $('#jgallery_main_image_title').html(mainAlt);
  8. return false;
  9. });
  10. })(jQuery);

I odpowiadający fragment kodu HTML:
  1. <div class="jgallery" />
  2. <div id="jgallery_main_image">
  3. <img src="/images/stories/fruit/peas.jpg" alt="peas.jpg" />
  4. <h2 id="jgallery_main_image_title">Peas</h2>
  5. </div>
  6.  
  7. <div id="jgallery_image_thumbs">
  8. <ul>
  9. <li><a href="/images/stories/fruit/peas.jpg" title="Peas">
  10. <img src="/images/stories/fruit/peas.jpg" alt="peas.jpg" />
  11. </a></li>
  12. <li><a href="/images/stories/fruit/cherry.jpg" title="Cherry">
  13. <img src="/images/stories/fruit/cherry.jpg" alt="cherry.jpg" />
  14. </a></li>
  15. <li><a href="/images/stories/fruit/strawberry.jpg" title="Strawberry">
  16. <img src="/images/stories/fruit/strawberry.jpg" alt="strawberry.jpg" />
  17. </a></li>
  18. <li>
  19. <a href="/images/stories/fruit/pears.jpg" title="Pears">
  20. <img src="/images/stories/fruit/pears.jpg" alt="pears.jpg" />
  21. </a></li>
  22. </ul>
  23. </div>
  24.  
  25. </div>


Z góry dzięki za pomoc, bo mnie już oczy bolą od tego szukania :/
erix
Pokaż to gdzies na żywo.
wdev
Wrzuciłem to na żywo tutaj. A tu jest tutorial, z którego korzystałem. I choćbym się wysilał nie wiem jak, to nie jestem w stanie znaleźć różnicy, która mogłaby sprawić, że mój skrypt nie działa... Tak, wiem, że tamto jest na starej wersji jQuery, ale na tamtej też już próbowałem.
krowal
Nie działa Ci dlatego, że kod JS wykonuje Ci się jeszcze zanim wyświetlisz linki i obrazki, zdarzenia 'click' nie są wtedy podczepiane do żadnego z tych elementów.

Ten kod:
[JAVASCRIPT] pobierz, plaintext
  1. <script type="text/javascript">
  2. (function($){
  3. $('#jgallery_image_thumbs a').click(function(e){
  4. window.alert('1');
  5. var mainPath = $(this).attr('href');
  6. var mainAlt = $(this).attr('title');
  7.  
  8. $('#jgallery_main_image img').attr({ src: mainPath, alt: mainAlt });
  9. $('#jgallery_main_image_title').html(mainAlt);
  10. return false;
  11. });
  12. })(jQuery);
  13. </script>
[JAVASCRIPT] pobierz, plaintext

daj na samym końcu tej strony, albo zostaw tam gdzie jest, ale zmień na:
[JAVASCRIPT] pobierz, plaintext
  1. <script type="text/javascript">
  2. $(document).ready(function(){
  3. $('#jgallery_image_thumbs a').click(function(e){
  4. window.alert('1');
  5. var mainPath = $(this).attr('href');
  6. var mainAlt = $(this).attr('title');
  7.  
  8. $('#jgallery_main_image img').attr({ src: mainPath, alt: mainAlt });
  9. $('#jgallery_main_image_title').html(mainAlt);
  10. return false;
  11. });
  12. })
  13. </script>
[JAVASCRIPT] pobierz, plaintext


Ewentualnie zamiast .click(function(){...}) możesz dać .live('click', function(){...})
wdev
Ok, chyba nie doczytałem podręcznika, a koniecznie chciałem zachować enkapsulację (to moduł do Joomli, więc wolę, żeby kod był odporny). Myślałem, że podczas enksapsulacji automatycznie się wykona, tak jak skórt $(function(){}). No nic, człowiek uczy się całe życie ^^ Dzięki za pomoc.
krowal
jak już napisałem,
Ewentualnie zamiast .click(function(){...}) możesz dać .live('click', function(){...})
To Ci pozwoli zostać przy dotychczasowym zapisie jeśli Ci aż tak na nim zależy.
wdev
Nie ma potrzeby robić .live, wystarczy:
[JAVASCRIPT] pobierz, plaintext
  1. (function($){
  2. $(document).ready(function(){
  3. // kod
  4. });
  5. })(jQuery);
[JAVASCRIPT] pobierz, plaintext

Jest enkapsulacja i jest (document).ready. Mój problem już jest rozwiązany, ale może komuś innemu się przyda winksmiley.jpg
erix
To też zależy. winksmiley.jpg

Na oficjalnym blogu jQuery był ostatnio artykuł, który mówił o tym, że w części przypadków lepiej używać live zamiast wrappera do DOMContentLoaded. Dotyczy to np. generowania dużego drzewa DOM przez serwer.
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.