【发布时间】:2012-01-17 20:21:10
【问题描述】:
我的调试技能并不能帮助我找出我在这里做错了什么。
我希望数组中的每个元素在指定时间后使用 setTimeout 函数进行动画处理。
我没有收到任何错误,并且循环似乎运行得很好,但是,数组中的所有元素最终都没有从原来的位置移动到新位置。
function publicity()
{
// placing elements with class name 'cCameras' inside an array
var eCamerasArray = $(".cCameras").toArray();
// creating 2 arrays to hold left & top values of each element
var iLeftPosArray = [];
var iTopPosArray = [];
// loop to run through each element in array
for( var i = 0; i < eCamerasArray.length; i++)
{
// timer variable set for each element to be used in setTimeout func.
var timer = Math.floor (Math.random()*300) + 100;
// setTimeout func. used to animate each element after a specified (timer) time
window.setTimeout (function ()
{
iLeftPosArray[i] = Math.floor (Math.random() *139) + 360;
iTopPosArray[i] = Math.floor (Math.random() *160) + 100 ;
$(eCamerasArray[i]).animate ({left: iLeftPosArray[i] + "px", top: iTopPosArray[i] + "px"}, 100, "linear");
return [iLeftPosArray[i], iTopPosArray[i]];
}, timer);
}
}
【问题讨论】:
-
javascript 没有块级范围,因此所有函数都将引用相同的
i.. 有人在此找到重复项:p -
@Esailija,你完全失去了我,请你详细说明。
-
@Esailija - 他在数组中使用它,我认为他不会对这段代码有这个问题。 Kayote,通过确认
eCamerasArray的值开始调试,然后循环后得到iLeftPosArray和iTopPosArray的值。 -
@KevinB ?循环立即执行,一旦超时开始触发,
i将与创建的所有函数的值相同。每天至少有 10 个问题。 -
@KevinB,做到了。 Firebug 实际上通过该函数运行得相当奇怪,但确实运行了所有函数,包括通过 console.log 输出数组正确的内容。 iLeftPosArray & iTopPosArray 也给出了正确的值。
标签: javascript jquery arrays jquery-animate settimeout