0

我有一些类似的代码,它在一些图像中移动......它可以工作,但它似乎不尊重计时器

var i = 1;
var indexArray = array(1,2,3);
var timerx = new Array();

$( indexArray ).each(function( indexArraykey ) {

    function internalCallback ( i, indexArraykey ) {
        val = indexArray[indexArraykey];
        console.log("test " + i + val);
    }); 

    timerx[i] = setTimeout( internalCallback( i, indexArraykey ), i * 500000 );                     

    i++;

}); 
4

3 回答 3

4

几点:

  • i在调用回调时具有循环结束的值。
  • 要使用 jQuery 遍历数组,请使用$.each(array,,而不是$(array).each(
  • 该函数不必在循环中定义
  • each 将索引作为回调的第二个参数,并将值作为第一个参数。

所以看起来你想要的实际上是这样的:

var indexArray = array(1,2,3);
var timerx = [];
$.each(indexArray, function( indexArrayValue, i ) {
    timerx.push(setTimeout(function(){
        console.log("test " + i + ' : ' + indexArrayValue);
    }, (i+1) * 500000));
}); 
于 2013-03-22T15:19:47.193 回答
1

我不是 javascript 专家,但看起来这里internalCallback被调用而不是作为函数传递给setTimeout.

尝试这个:

var i = 1;
var indexArray = [3,6,9];
var timerx = new Array();

$( indexArray ).each(function( indexArraykey ) {

    function internalCallback ( i, indexArraykey ) {
        return function () {
            val = indexArray[indexArraykey];
            console.log("test " + i + val);
        }
    } 

    timerx[i] = setTimeout( internalCallback( i, indexArraykey ), i * 5000);                     

    i++;

}); 

这是小提琴http://jsfiddle.net/Guxdz/2/(检查控制台日志)

于 2013-03-22T15:40:42.797 回答
1

那设计太差了,不就是一个完全的反js模式,甚至超出了……你为什么要一遍又一遍地定义相同的函数!!!

$(imgNumArray).each(function (indexArraykey) {
    (function (i) {
        timerx[i] = setTimeout(internalCallback(i, indexArraykey), i * 500000);
    })(i++);
});

function internalCallback(i, indexArraykey) {
    val = indexArray[indexArraykey];
    console.log("test " + i + val);
}
于 2013-03-22T15:32:17.333 回答