0

我有几个可调整大小的对象,当我停止调整对象大小时,我想触发函数'changeS()'。
函数 changeS() 应该将调用它的对象的名称作为第一个参数。
我的意思是:
当我停止调整对象“#resizable0”的大小时,应该调用 changeS(#resizable0,new_size - old_size),
当我停止调整对象“#resizable1”的大小时,应该调用 changeS(#resizable1,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);
    }
});
}

我不知道如何正确地将对象名称作为函数的参数传递。
当函数 changeS() 被执行时,它总是以相同的名称调用 - 最后创建的对象的名称(“#resizable5” - 在这种情况下)。

我的问题是:
如何为每个对象使用相应的参数(该对象的名称)调用函数 changeS()?

谢谢,popKonr

4

1 回答 1

1

您在循环中创建的函数是闭包。它们保持对它们关闭的变量的持久引用,而不是定义函数时的值的副本。因此,他们所有人都看到了您分配给的最后一个值$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_sizeold_size工厂功能。事件处理程序将关闭该数据,因此它们中的每一对都将获得这些变量的自己的私有副本。

闭包并不复杂,但人们往往会误解一些关于它们的基本知识。但是,一旦你把它们放下来,你就会处于良好的状态。

于 2011-06-03T09:08:46.267 回答