Функции, которые вы создаете в цикле: замыкания . Они сохраняют стойкую ссылку на переменные, по которым они закрываются, не копию значения на момент определения функции. И поэтому все они видят последнее значение, которое вы присваиваете $res
, а не значение во время «их» цикла.
Обычный способ решить эту проблему - использовать заводскую функцию, что-то вроде этого:
var x,i;
for(i=0; i<5; i++){
x = "#resizable"+i;
var $res = $(x);
makeResizeable($res);
}
function makeResizeable($thisres) {
var old_size = 0,
new_size = 0;
$thisres.resizable({
grid: 22, minHeight:22, handles: 's',
start: function(event,ui) {
old_size = ui.originalSize.height;
},
stop: function(event,ui) {
new_size = ui.size.height;
if(new_size!=old_size)
changeS($thisres,new_size - old_size);
}
});
}
Обратите внимание, как мы теперь используем $thisres
, аргумент, передаваемый в фабричную функцию makeResizeable
, а не $res
, поскольку аргумент, встроенный в функции, которые мы создаем в makeResizeable
, не изменяется. Также обратите внимание, что я переместил new_size
и old_size
в эту фабричную функцию. Обработчики событий будут закрывать эти данные, и каждая пара получит свои собственные копии этих переменных.
Замыкания не сложны , но есть несколько фундаментальных вещей, которые люди склонны неправильно понимать. Но как только вы их опустите, вы будете в хорошей форме.