首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在循环中创建的jQuery-resizable对象中使用正确的参数调用函数?

如何在循环中创建的jQuery-resizable对象中使用正确的参数调用函数?
EN

Stack Overflow用户
提问于 2011-06-03 17:03:45
回答 1查看 339关注 0票数 0

我有几个可调整大小的对象,当我停止调整对象大小时,我想触发函数'changeS()‘。

函数changeS()应该将被调用的对象的名称作为第一个参数。

我的意思是:

当我停止调整对象“#sizable0”的大小时,应该调用changeS(#sizable0,new_size - old_size),

当我停止调整对象“#sizable1”的大小时,应该调用changeS(#sizable1,new_size - old_size),依此类推。

当我在代码中为我拥有的每个对象设置这个方法时,一切都是正常的,但我想在循环for()中这样做,因为将会有更多的对象,然后我就会有一个问题:

代码语言:javascript
运行
复制
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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-06-03 17:08:46

您在循环中创建的函数是闭包。它们保留了对它们关闭的变量的持久引用,而不是定义函数时的值的副本。因此,它们都会看到您分配给$res的最后一个值,而不是“它们”循环期间的值。

通常解决此问题的方法是使用工厂函数,如下所示:

代码语言:javascript
运行
复制
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移到了工厂函数中。事件处理程序将关闭该数据,因此每一对事件处理程序都将获得这些变量的私有副本。

Closures are not complicated,但有一些基本的事情,人们往往会误解。不过,一旦你把这些都记下来了,你就会状态良好。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6225043

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档