“for”中的 Javascript Draggables 回调函数问题陈述

发布于 2024-10-07 10:07:56 字数 1170 浏览 4 评论 0原文

我定义了一个数组:

images_array[0]=['c5','user.png','100','100'];
images_array[1]=['c6','user.png','300','400'];
images_array[2]=['c7','mega1.jpg','400','500'];

像这样创建可拖动对象:

drag_array[images_array[0][0]]=new Draggable(images_array[0][0], { revert: true, onEnd:function(){displaymessage(drag_array[images_array[0][0]]);}});

drag_array[images_array[1][0]]=new Draggable(images_array[1][0], { revert: true, onEnd:function(){displaymessage(drag_array[images_array[1][0]]);}});

drag_array[images_array[2][0]]=new Draggable(images_array[2][0], { revert: true, onEnd:function(){displaymessage(drag_array[images_array[2][0]]);}});

在 for 语句中创建可拖动对象不适用于回调函数...

for (i=0;i<images_array.length;i++) {
drag_array[images_array[i][0]]=new Draggable(images_array[i][0], { revert: true, onEnd:function(){displaymessage(drag_array[images_array[i][0]]);}});
}

=> Firefox 说 images_array[i][0] 未定义... 去掉回调函数

drag_array[images_array[i][0]]=new Draggable(images_array[i][0], { revert: true});

=>有效...:(

知道为什么回调函数的最新参数不起作用吗? TX

I defined an array :

images_array[0]=['c5','user.png','100','100'];
images_array[1]=['c6','user.png','300','400'];
images_array[2]=['c7','mega1.jpg','400','500'];

creating draggables like this work:

drag_array[images_array[0][0]]=new Draggable(images_array[0][0], { revert: true, onEnd:function(){displaymessage(drag_array[images_array[0][0]]);}});

drag_array[images_array[1][0]]=new Draggable(images_array[1][0], { revert: true, onEnd:function(){displaymessage(drag_array[images_array[1][0]]);}});

drag_array[images_array[2][0]]=new Draggable(images_array[2][0], { revert: true, onEnd:function(){displaymessage(drag_array[images_array[2][0]]);}});

Creating draggables in a for statement does not work on the callback function...

for (i=0;i<images_array.length;i++) {
drag_array[images_array[i][0]]=new Draggable(images_array[i][0], { revert: true, onEnd:function(){displaymessage(drag_array[images_array[i][0]]);}});
}

=> Firefox says that images_array[i][0] is not defined...
Removing the callback function

drag_array[images_array[i][0]]=new Draggable(images_array[i][0], { revert: true});

=> works ... :(

Any idea why the latest argument from the callback function is not working?
tx

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

淡忘如思 2024-10-14 10:07:56

这是一个典型的错误:在循环中定义函数。如果您定义一个可以访问循环变量i的函数,那么当该函数定义时,该变量不会计算,但当它被定义时,该变量不会计算。 打电话。但此时,循环已经完成,并且 i 有一些不需要的值(在您的情况下 images_array.length + 1)。 JavaScript 只有函数作用域,而不是块作用域。

您必须通过例如使用立即函数来捕获 i 的值:

for (i=0;i<images_array.length;i++) {
    drag_array[images_array[i][0]] = new Draggable(
            images_array[i][0], 
            { revert: true, 
              onEnd: (function(index) {
                         return function(){
                             displaymessage(drag_array[images_array[index][0]]);
                         };
                     }(i))
            });
}

另请参阅傻瓜式闭包,示例 5 和 这里有很多关于SO的问题

This is one typical mistake: Defining functions in a loop. If you define a function that has access to the loop variable i, then this variable is not evaluated when the function is defined but when it is called. But at this time, the loop already finished and i has some undesired value (in your case images_array.length + 1). JavaScript has only function scope, not block scope.

You have to capture the value of i by e.g. using a immediate function:

for (i=0;i<images_array.length;i++) {
    drag_array[images_array[i][0]] = new Draggable(
            images_array[i][0], 
            { revert: true, 
              onEnd: (function(index) {
                         return function(){
                             displaymessage(drag_array[images_array[index][0]]);
                         };
                     }(i))
            });
}

See also Closures for Dummies, Example 5 and a lot of questions here on SO.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文