我有几个可调整大小的对象,当我停止调整对象大小时,我想触发函数'changeS()‘。
函数changeS()应该将被调用的对象的名称作为第一个参数。
我的意思是:
当我停止调整对象“#sizable0”的大小时,应该调用changeS(#sizable0,new_size - old_size),
当我停止调整对象“#sizable1”的大小时,应该调用changeS(#sizable1,new_size - old_size),依此类推。
当我在代码中为我拥有的每个对象设置这个方法时,一切都是正常的,但我想在循环for()中这样做,因为将会有更多的对象,然后我就会有一个问题:
var old_size=0;
var new_size=0;
var x,i;
for(i=0; i<5; i++){
x = "#resizable"+i;
var $res = $(x);
$res.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($res,new_size - old_size);
}
});
}我不知道如何正确地将object的名称作为函数的参数传递。
当执行函数changeS()时,它总是以相同的名称调用--与最后创建的对象的名称相同(“#sizable5”--在本例中)。
我的问题是:
如何使用相应的参数(此对象的名称)调用函数changeS()?
谢谢,popKonr
发布于 2011-06-03 17:08:46
您在循环中创建的函数是闭包。它们保留了对它们关闭的变量的持久引用,而不是定义函数时的值的副本。因此,它们都会看到您分配给$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移到了工厂函数中。事件处理程序将关闭该数据,因此每一对事件处理程序都将获得这些变量的私有副本。
Closures are not complicated,但有一些基本的事情,人们往往会误解。不过,一旦你把这些都记下来了,你就会状态良好。
https://stackoverflow.com/questions/6225043
复制相似问题