Nie napisałeś, z jakiej biblioteki korzystasz. Skąd mamy wiedzieć, co zwraca funkcja $?
Domyślam się, że korzystasz z jQuery. Skoro tak, to nie używaj zwykłej, przeglądarkowej obsługi zdarzeń, czyli onload. Zamiast tego użyj funkcji load, zapewnianej przez jQuery (działającej podobnie jak click). Jak czegoś nie wiesz, to poszukaj funkcji load na api.jquery.com.
Poza tym popraw formatowanie (wcięcia!). Nie widać, co należy do ciała funkcji anonimowej podstawianej do onload, a co nie. Staranność i drobiazgowość we wcięciach jest ważna.
No i masz klasyczny błąd wynikający z braku zrozumienia domknięć. Podstawowa zasada jest taka, by nie używać ich w pętli, gdy nie wiesz, co robisz ;). Gdy wywoła się funkcja obsługująca zdarzenie load dla dowolnego obrazka, to zmienna wczytanezdjecia będzie zawsze miała wartość równą adresy.length (!).
Spróbuj wydzielić funkcję tworzącą obiekt jQuery i dodającą te wszystkie bajery, które masz w ciele pętli. Zrób coś takiego:
function stworz_obiekt_zdjecia(nr) {
var $zdjecie = $(document.createElement('img'));
$zdjecie.attr({ src: adresy[nr] });
$zdjecie.load(function() { // zamiast onload
$zdjecie.attr(...);
$zdjecie.click(prezentuj);
});
return $zdjecie;
}
Tutaj założyłem, że funkcja zależy tylko od zmiennej wczytanezdjecia. Zmienna ta zostanie przekazana do funkcji w parametrze nr. Jeśli zależy ona od jeszcze innych zmiennych (np. strona, str -- z fragmentu Twojego kodu nie wiadomo, skąd one się biorą), to możesz dodać kolejne parametry. Ale jeśli będzie ich więcej niż 3, to coś jest nie tak.
Zwracaną zmienną nazwałem $zdjecie, bo taka jest konwencja, by nazwy obiektów jQuery rozpoczynać od $. To tylko taka umowa programistów, w rzeczywistości znaczek $ niczego specjalnego dla JavaScriptu nie oznacza.
Funkcję stworz_obiekt_zdjecia wywołuj po prostu zamiast ciała pętli:
while ( wczytanezdjecia < adresy.length ) {
zdjecie[wczytanezdjecia] = stworz_obiekt_zdjecia(wczytanezdjecia);
wczytanezdjecia++;
}
Zauważ proszę, że pozwoliło to uniknąć powtórzeń zdjecie[indeks], których JavaScript nie lubi (są wolne!).
Szczerze mówiąc nie podoba mi się nazwa zmiennej 'wczytanezdjecia'. W momencie gdy pętla jest wywoływana, te zdjęcia nie są jeszcze wczytane. IMO prawdopodobnie możesz wywalić tę zmienną globalną i w funkcji blabla() stworzyć lokalną zmienną iteracyjną o nazwie choćby "i" (w małym, lokalnym zakresie takie nazwy są OK). Albo "nr_zdjecia", jak chcesz być bardziej... treściwy. Pętlę while możesz wtedy zmienić na for.
function blabla() {
..
for (var nr_zdjecia = 0; nr_zdjecia < adresy.length; nr_zdjecia++) {
zdjecie.push(stworz_obiekt_zdjecia(nr_zdjecia)); // to samo co zdjecie[nr_zdjecia] = stworz_obiekt_zdjecia(nr_zdjecia)
}
..
}
I kod robi się bardziej elegancki :).
Aha, tablicę zdjęć nazwij raczej "zdjecia" a nie "zdjecie". Tablica reprezentuje przecież wiele obiektów, niech ma liczbę mnogą. Tylko wprowadzaj te wszystkie zmiany po kolei, a nie naraz!