@bagsiur:
Pętla for zapewne jest szybsza niż each
. Nie każdy tego typu problem też tak można rozwiązać, a to ważna rzecz jest, z czym @Krzysiekk89 ma problem.
@Krzysiekk89:
Tworzysz funkcję w pętli for
(tę obsługującą zdarzenie, anonimową). W tej funkcji próbujesz używać iteratora (i
). Normalne IDE (np. PhpStorm) wskaże Ci ten błąd ( patrz: http://i.imgur.com/sOcsKlu.png ). Nie mam pojęcia jak to dokładniej opisać, ale żeby się tego pozbyć musisz utworzyć scope
(po polsku: zakres, czasem bodajże nazywany "kontekstem"), w którym i
w Twojej funkcji stanie się lokalne i nie będzie modyfikowane przez pętlę.
Wygląda to tak:
for (var i = 1; i < 8; i++) {
(function(moje_i){
// moje_i jest tutaj lokalne
$("#auto"+moje_i).change(function () {
var x = $(this).find("option:selected").val();
$("div#kwota"+moje_i).text(x);
});
})(i); // tworzysz anonimową funkcję, którą natychmiast wywołujesz, przekazując jej jako parametr `i` (w funkcji nazywa się to `moje_i`)
}
Inną opcją byłoby coś podobnego, co @bagsiur podpowiada, czyli:
$("#auto1, #auto2, #auto3, #auto4, #auto5, #auto6, #auto7, #auto8").change(function () {
var i = $(this).attr('id').replace(/^auto/, ''); // `i` to teraz ten numerek
});
Selektory mogłyby być tu różne. Nie wiem jak wygląda Twój HTML, ale być może wystarczyłoby coś w stylu: #jakasForma select
, albo #jakasForma select[id^=auto]
(id
zaczyna się od auto
). Możliwe też, że Twoje elementy nie potrzebują id
, i mógłbyś zastosować klasy i dodatkowy atrybut "zliczający", np. <select class="auto" data-numer="1">
- wtedy wybrałbyś .auto
i pobierałbyś ten atrybut (zamiast replace
pokazanego wyżej).
I jeszcze jedno. Jeżeli Twoje #auto1
to jest <select>
(tego nie wiem) to możesz użyć po prostu:
$(this).val();
// zamiast
$(this).find("option:selected").val();