javascript rzeczywisty rozmiar obrazka

0

Witam pomoże mi ktoś bo nie rozumiem jak to w ogóle możliwe ze sie tak dzieje :)

var width;
var height;
var img = $('<img src="'+$this+'"/>').load(function(){
        width = this.width;
        alert(width); // tutaj normalna wartosc
        height = this.height;
    });
alert(width); // tutaj 'undefined'
alert(height); // tutaj normalna wartosc
2
  1. Najpierw deklarujesz zmienna width i height wiec powinny one byc "undefined" poniewaz nie przypisales do nich zadnej wartosci.

  2. Później zlecasz pobranie obrazka, które będzie troche trwać więc zawartość funkcji load wykona się chwilę po

alert(width); // tutaj 'undefined'
 

Powyższy kod wyświetli wartosc undefined ponieważ funkcja load się jeszcze nie wykonała.

  1. Wykonuje się kod zawarty w funkcji load (pewnie na innym wątku i chyba dlatego takie cos jak przykrycie jednego alerta drugim jest mozliwe), przypisuje wartość do zmiennej width i wyświetla komunikat, który przykrywa komunikat wyświetlony w pkt. 2. Aby to zobaczysz proponuje zmodyfikować kod poza ciałem funkcji load do następującej postaci
alert("Jaskis dlugi tekst rozszerzajacy wyskakujace okno z wartoscia undefined" + width); // tutaj 'undefined'
 

Wtedy zobaczysz dwa alerty jeden na drugim

  1. Klikasz na przycisk w alercie z poprawna wartoscia (ten z funkcji load) co powoduje przypisanie poprawnej wartosci height i odsłonięcie okienka z wartościa undefined.

  2. Poza funkcja load masz dwa alerty - pierwszy alert wstrzyma wykonywanie kodu w obszarze poza funkcja load. Tzn dopóki nie zamkniesz tego alerta to nie wykona sie ostatni alert. Jak juz go zamkniesz to wtedy zmienna height zdazy sie zainicjalizować.

To chyba tak dziala, bo prawde mowiac o tej godzinie ciezko sie co kolwiek debuguje.

1
1. var width;
2. var height;
3. var img = $('<img src="'+$this+'"/>').load(function(){
6        width = this.width;
7        alert(width); // tutaj normalna wartosc
8        height = this.height;
    });
4. alert(width); // tutaj 'undefined'
5. alert(height); // tutaj normalna wartosc

Ujmę w skrócie to co kolega wyżej napisał.
w 3. linijce masz podpięcie funkcji, która ma się wywołać na zdarzenie load, a nie wywołanie tej funkcji. Nie wiesz kiedy ona się wywoła. Dlatego nie można robić tak jak w przykładzie. Może się wykonać w kolejności jak ponumerowałem linie. Chyba nie bardzo co?

0

no racja nie miałem pojecia ze wywoluje sie to jako wątek teraz to ma jakikolwiek sens. Dzięki za pomoc chlopaki. Pozdrawiam

1 użytkowników online, w tym zalogowanych: 0, gości: 1