Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [jQuery] Zliczanie szerokosci wszystkich img w ul
Forum PHP.pl > Forum > Po stronie przeglądarki > JavaScript
haryb
Mam następujący problem:

Mam sobie liste img np:
  1. <div class="box">
  2. <div class="inside zdjeciaPoziom">
  3. <ul class="zdjecia_pokaz">
  4. <li>
  5. <a href="http://yamahafjr.najlepsza.pl/kohana3/www/images/photography/foto/waterfall.jpg" >
  6. <img alt="waterfall.jpg" src="http://yamahafjr.najlepsza.pl/kohana3/www/images/photography/foto_m/waterfall.jpg" class="foto_gallery"/>
  7. </a>
  8. </li>
  9. <li>
  10. <a href="http://yamahafjr.najlepsza.pl/kohana3/www/images/photography/foto/autumn_leaves.jpg" >
  11. <img alt="autumn_leaves.jpg" src="http://yamahafjr.najlepsza.pl/kohana3/www/images/photography/foto_m/autumn_leaves.jpg" class="foto_gallery" />
  12. </a>
  13. </li>
  14. <li>
  15. <a href="http://yamahafjr.najlepsza.pl/kohana3/www/images/photography/foto/creek.jpg" >
  16. <img alt="creek.jpg" src="http://yamahafjr.najlepsza.pl/kohana3/www/images/photography/foto_m/creek.jpg" class="foto_gallery" />
  17. </a>
  18. </li>
  19. <li>
  20. <a href="http://yamahafjr.najlepsza.pl/kohana3/www/images/photography/foto/desert_landscape.jpg" >
  21. <img alt="desert_landscape.jpg" src="http://yamahafjr.najlepsza.pl/kohana3/www/images/photography/foto_m/desert_landscape.jpg" class="foto_gallery" />
  22. </a>
  23. </li>
  24. </ul>
  25. </div>
  26. </div>

I teraz w js poniżej mam:
  1. widthZdjeciaPoziom = 0;
  2. $('img.foto_gallery').each(function(){
  3. widthZdjeciaPoziom += $(this).attr('width') + 2;
  4. });
  5.  
  6. $('.zdjeciaPoziom ul').css('width', widthZdjeciaPoziom);

Kod ten zlicza mi po załadowaniu zdjęć ich szerokość całkowita plus marginesy i ustawia jak style inline.
Wszystko ok działa - jak odświeżam F5, ctrl+F5 ale się mechanizm źle zlicza jak odświeżę ctrl+F5 - czyli czyszcząc cache przeglądarki dla tej podstrony.
Wówczas nie wiadomo czemu źle się oblicza szerokość i np zamiast 1400 oblicza 416.

Domyślam się że to jest związane z tym że zdjęcia sie wszystkie nie zdążyły załadować a już funkcja sie wykonała. Jednak użycie funkcji $(document).ready(function (){..... tez nic nie dało.

Podpowiedzcie co by trzeba było zrobić - zmienić w tym kodzie by zawsze niezależnie jak odświeżam stronie i ile jest obrazków czy 3, 4, 40 dobrze mi obliczał ta szerokość ogólna.
#luq
Kod
$(document).ready()

odpada zupełnie bo to odpala funkcję podaną jako argument po załadowaniu drzewka DOM, gdy obrazki nie są jeszcze załadowane.

Czysty kod odpalany bez zdarzenia odpalany jest wtedy dojdzie do niego parser, a idzie od góry do dołu.

Zdarzenie onload w czystym JS powinno zadziałać, chyba że jQ ma zastępnik tego zdarzenia...
wookieb
zamiast $(document).ready użyj window.onload = function() Poza tym m.in z takich względów do obrazków ZAWSZE powinno się podawać atrybut width i height
haryb
No w sumie pomogło to przy pierwszym odpaleniu strony - juz szerokość sie ok oblicza.
Jednak teraz problem jest z podmiana poprzez ajax.

Ponieważ poniżej tego kodu html mam powiedzmy przycisk ktory podmienia mi zawartosc tego calego ul na nowy z nowymi zdjeciami itd i nawet jesli ponim wywolalem jeszcze raz ta funkcje ustawiajaca szerokosc to nie działa poprawne zliczanie.

Dodałem dla testów na sztywno parametr width do img jednak nic nie pomogło - ponieważ on i tak wówczas musi przejść po each elemencie ul i pododawać sobie. Wiec tutaj i tak to nie dziala jak powinno.

#luq
Cytat(haryb @ 15.07.2010, 11:11:50 ) *
Jednak teraz problem jest z podmiana poprzez ajax.

Pokaż jak to robisz, może nie dajesz tej funkcji po ustawieniu readyState == 4?
haryb
To jest taki czysto testowy - kod - recznie wprowadzony response - to bedzie generowane i jakies czasem nazwy z du.. ale chodzi o samo działanie.


  1. <script type="text/javascript">
  2. $('#xxx').live('click', function() {
  3. $.ajax({
  4. type: "POST",
  5. url: "<?php echo ABBPATH;?>/special_controller/ajax/admin_gallery/xxx",
  6. //data: dane,
  7. success: function(responseHtml) {
  8. $(".zdjecia_pokaz").html("<ul class=zdjecia_pokaz><li><a href=http://yamahafjr.najlepsza.pl/kohana3/www/images/photography/foto/waterfall.jpg width=308 ><img alt=waterfall.jpg src=http://yamahafjr.najlepsza.pl/kohana3/www/images/photography/foto_m/waterfall.jpg width=308 class=foto_gallery/></a></li><li><a href=http://yamahafjr.najlepsza.pl/kohana3/www/images/photography/foto/autumn_leaves.jpg ><img alt=autumn_leaves.jpg src=http://yamahafjr.najlepsza.pl/kohana3/www/images/photography/foto_m/autumn_leaves.jpg width=308 class=foto_gallery /></a></li></ul>");
  9.  
  10. widthZdjeciaPoziom = 0;
  11. $('img.foto_gallery').each(function(){
  12. widthZdjeciaPoziom += $(this).attr('width') + 2;
  13. });
  14. $('.zdjeciaPoziom ul').css('width', widthZdjeciaPoziom);
  15.  
  16. }
  17. });
  18.  
  19. });
  20.  
  21. window.onload = function () {
  22. widthZdjeciaPoziom = 0;
  23. $('img.foto_gallery').each(function(){
  24. widthZdjeciaPoziom += $(this).attr('width') + 2;
  25. });
  26. $('.zdjeciaPoziom ul').css('width', widthZdjeciaPoziom);
  27. }
  28. </script>
  29.  
wookieb
1) Po co ustawiasz parametr width dla ul?
2) Tak to jest nie używa się cudzysłowiów w parametrach...
  1. <img width="360" class="foto_gallery" />
haryb
Super działa
wystarczyło faktycznie dorzucic te "" do atrybutów, nawet dziala bez znacnzików width.

Dzięki
Pozdro
Hary
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.