jquery javascript停止在嵌套数组迭代中计算未定义的对象

时间:2012-11-18 14:30:42

标签: javascript jquery undefined loops multidimensional-array

我有一个数组数组,一些内部数组还有另一个嵌套数组。有些人没有。我遍历顶级数组元素,如果有一个内部数组我循环它们。如果没有,我没有。或者我认为。

由于某种原因,当我的迭代找到没有嵌套数组的数组时,我的控制台显示“type error”undefined ...这在技术上是正确的,因为没有定义嵌套数组。但是我认为我的嵌套if语句不允许这样做。有什么想法吗?

例如,动画[0] [3]是一个数组,但动画[1] [3]是未定义的。所以在我的if循环中我有一个嵌套的

var a = animations.shift();

if ( a[3] )
{
  console.log( 'a[3] is: ' + a[3] )
}
else
{
  return;
}

我读到,因为,如果[3]存在将其记录到控制台,如果没有打印到没有打印到控制台...但我的控制台继续产生未定义的评估。那是因为只是测试它的存在会返回一个未定义的错误吗?每次遇到没有嵌套数组的数组时,如何阻止此错误弹出?

感谢。

var animations = [
    ['.pcba','fadeIn', [1000], [
        ['.pcb_cad', 'fadeIn', [1000] ]
        ]
     ],
    ['.pcba', 'delay', [2000] ],
    ['.pcba','fadeOut', [1000], [
        ['.heatGenComps', 'fadeIn', [1000] ],
        ['.arrows', 'fadeIn', [1000] ]
        ]
    ],
    ['.heatGenComps', 'delay', [2000] ],
    ['.heatGenComps', 'fadeOut', [1000], [
        ['.arrows', 'fadeOut', [1000] ],
        ['.pcb_cad_cfd', 'fadeIn', [1000] ],
        ['.wePredOpTemps', 'fadeIn', [1000] ]
        ]
    ],

 ]; 

我按照以下方式迭代它们:

iter();
function iter(){

if (!animating) return;

 var a = animations.shift();

if (a) {
     var el = a[0];
     var fn = a[1];
     var args = a[2];

     $.fn[ a[1] ].apply( $( a[0] ), a[2] ).promise().done(iter);
     if ( a[3] )
     {
        var secondary = a[3];
        console.log( 'a[3] is: ' + a[3] );
        secondaryAnime();
        function secondaryAnime(){
            b = secondary.shift();
            console.log('secondary is: ' + b );
            $.fn[ b[1] ].apply( $( b[0] ), b[2] );
            secondaryAnime();
         };

     }
     else
     {
        return;
     }


}
else
{

}

};

2 个答案:

答案 0 :(得分:1)

事实上,你有很多简单动画链的代码。 你想要做的就是在每一步中同时制作一些动画。

你听说过plugin jquery-timing了吗?它允许连接几乎没有代码的任何异步内容。我将使用jquery-timing样式编写的完整代码完全代表您的动画链,整个代码

$('.pcb_cad').fadeIn(1000)
    .$('.pcba').fadeIn(1000,$).wait(2000).fadeOut(1000)
    .$('.heatGenComps, .arrows').fadeIn(1000,$).wait(2000).fadeOut(1000)
    .$('.pcb_cad_cfd, .wePredOpTemps').fadeIn(1000);

如你所见,它只是一个很长的jQuery链。

这里只有两个来自该插件的计时方法是必要的。 首先,只要您想等待方法链中的以下jQuery命令等待完成淡入淡出动画,就可以编写.fadeIn(...,$)。 方法.wait(timeout)将在给定的超时后继续方法链中的所有以下方法。

该插件有更多直观的方式来推迟和连接您的行为。

答案 1 :(得分:0)

异常的原因是你如何迭代你的嵌套数组b。当您停止提取secondary.shift();

时,您没有结束条件

在分配secondary.shift()后测试“if(b){...}”你会没事的。

BTW:你不需要写所有空的“else”块。