Wartość zmiennej iteracyjnej w pętli for

0

Witam,

poniżej przedstawiam 2 pętle (myslę, że sensu ich nie ma co tłumaczyć, bo jest jasny, gdy się je porówna i przeczyta, co pod nimi):

for(var i = 0; i < tablica.length; i++)
{
    if(zdjecie1.attr('src') == tablica[i].src)
    {
        zdjecie2.attr('src',tablica[i].src);
    }
}
for(var i = 0; i < tablica.length; i++)
{
    if(zdjecie.attr('src') == tablica[i].src)
    {
        alert(tablica[i].src);
    }
}

Dlaczego w drugiej z nich ostatnia zmienna i zawiera każdy kolejny przebieg pętli (tyle okienek alert, ile przebiegów pętli - elementów tablicy tablica), a w pierwszej funkcji ostatnia zmienna i wskazuje jednorazowo na liczbę przebiegów pętli minus 1, czyli na ostatni element tablicy?

Na pierwszy rzut oka zachowanie tych dwu pętli wydaje się analogiczne (przynajmniej dla mnie), a tak nie jest. Dlaczego? Czy ktoś bardziej wtajemniczony mógłby mi to wyjaśnić? Dlaczego w przypadku drugiej pętli nie pojawi się tylko jedno okienko alert z liczbą przebiegów pętli minus 1?

Ta pierwsza pętla to oczywiście okrojona wersja pętli z projektu mojej strony - niestety nie działa tak jak sobie to wyobrażam i muszę posługiwać się instrukcją switch-case, co przy znacznej liczbie elementów jest dość uciążliwe.

Mam nadzieję, że to, co napisałem, jest zrozumiałe:)

Pozdrawiam
A.

0

Nie jestem specem od JS i nie wiedziałem, że w podanym przez Ciebie przypadku ten problem też występuje. W każdym razie zapewne chodzi o: http://james.padolsey.com/javascript/closures-in-javascript/
Po prostu do zdjecie.src nie jest przypisywana wartość ale info jak ją policzyć. Po wykonaniu się całej pętli każde zdjecie.src wskazuje na tablica[tablica.length - 1].src.

0

Domyślam się, że to gdzieś tu leży problem, jednak postępując według schematu przedstawionego w Twoim linku działanie nadal nie wychodzi. Co mnie zastanawia jednak to to, że wstawienie samego alerta z jakąkolwiek dowolną zawartością przynosi nieoczekiwany dla mnie rezultat przełączania kolejnych zdjęć (oczywiście jest to poprzedzone wyskoczeniem okienka alert).

Dla lepszego zobrazowania sytuacji wklejam cały kod - pierwsza pętla nie działa, druga natomiast przełącza zdjęcia wraz z wywołaniem alertu:

var tablica_SR = ["SR_foto/przy1.jpg", "SR_foto/przy2.jpg", "SR_foto/przy3.jpg", "SR_foto/przy4.jpg", "SR_foto/przy5.jpg", "SR_foto/przy6.jpg", "SR_foto/przy7.jpg", "SR_foto/przy8.jpg", "SR_foto/przy9.jpg", "SR_foto/przy10.jpg", "SR_foto/przy11.jpg", "SR_foto/przy12.jpg", "SR_foto/przy13.jpg", "SR_foto/przy14.jpg", "SR_foto/przy15.jpg", "SR_foto/przy16.jpg", "SR_foto/przy17.jpg", "SR_foto/przy18.jpg", "SR_foto/przy19.jpg", "SR_foto/przy20.jpg", "SR_foto/przy21.jpg", "SR_foto/przy22.jpg", "SR_foto/przy23.jpg", "SR_foto/przy24.jpg", "SR_foto/przy25.jpg", "SR_foto/przy26.jpg", "SR_foto/przy27.jpg", "SR_foto/przy28.jpg", "SR_foto/przy29.jpg", "SR_foto/przy30.jpg", "SR_foto/przy32.jpg", "SR_foto/przy33.jpg", "SR_foto/przy34.jpg"];

$(document).keydown(function(e) {
	e.preventDefault();
	if(e.keyCode == 32) {
		for (var i = 0; i < tablica_SR.length; i++) {
			if (SR.attr('src') == tablica_SR[tablica_SR.length-1]) {
				SR.attr('src',tablica_SR[0]);
			}
			else {
				SR.attr('src',tablica_SR[i+1]);
			};
                 };
	};
});

$(document).keydown(function(e) {
	e.preventDefault();
	if(e.keyCode == 32) {
		for (var i = 0; i < tablica_SR.length; i++) {
			if (SR.attr('src') == tablica_SR[tablica_SR.length-1]) {
				SR.attr('src',tablica_SR[0]);
			}
			else {
				SR.attr('src',tablica_SR[i+1]);
				alert('');
			};
                 };
	};
});

Nie mam pojęcia, o co tu chodzi.

0

Poddaję się...

Czy ktoś mógłby mi powiedzieć lub chociaż podpowiedzieć, jak ująć poniższy kod w pętlę?

$(document).keydown(function(e)
{
	e.preventDefault();
	if(e.keyCode == 32)
	{
		switch(SR.attr('src'))
		{
			case t_SR[0]: SR.attr('src',t_SR[1]); break;
			case t_SR[1]: SR.attr('src',t_SR[2]); break;
                        case t_SR[2]: SR.attr('src',t_SR[3]); break;
                        case t_SR[3]: SR.attr('src',t_SR[4]); break;
                        case t_SR[4]: SR.attr('src',t_SR[5]); break;
                        case t_SR[5]: SR.attr('src',t_SR[6]); break; // i tak dalej, dalej i dalej...
		};
	};
});

I małe objaśnienie:
SR to zdjęcie,
t_SR to tablica zawierająca atrybuty src danych zdjęć.

Jak widać moim celem jest przełączanie atrybutu src na kolejny poprzez kliknięciem na spację.

Będę bardzo wdzięczny za pomoc.

0

a po co w pętlę?

SR.attr('src', t_SR[(t_SR.indexOf(SR.attr('src')) + 1) % t_SR.length]);

ale zamiast za każdym razem wyszukiwać w tablicy poprzedniego elementu lepiej by było zapamiętaj indeks i go zwiększać

dlaczego Twoje pętle nie działały? Działały tylko że za każdym razem przyrównanie się zgadzało i przypisywało kolejny element, a w kolejnym przebiegu pętli znowu od nowa zgadzało się że element jest kolejnym i tak dochodziło do samego końca (no bo za każdym razem przypisywało kolejny element, a potem porównywało czy jest następnym elementem i go zwiększało). Rozwiązaniem było odwrócenie pętli (czyli porównywanie od końca do początku), albo wyjście z pętli po pierwszym pozytywnym przyrównaniu.

0

Dzięki Ci, Dobry Człowieku ;) To rozwiązanie z przerwaniem pętli po odpowiednim dopasowaniu okazało się banalnie proste - wystarczyło dopisać słówko "break" w odpowiednim miejscu :) I to rozwiązanie wydaje mi się najprostsze i najbardziej logiczne.

Pozdrawiam
A.

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