代码之家  ›  专栏  ›  技术社区  ›  David Thomas

如何使用jQuery在for循环的迭代中连续添加到变量?

  •  1
  • David Thomas  · 技术社区  · 14 年前

    我试着在一次迭代中增加一个数字 for 循环,在jQuery(1.4.2)中,按前一个元素的宽度。

    我试过以下方法:

    var
    $lis = $('#bookmarks > li'),
    liHeight = parseInt($lis.height()),
    numLis = $lis.length;
    console.log(numLis);
    
    var totalLeft = '0';
    console.log(totalLeft);
    
    for (i=1; i<numLis; i++) {
        var leftOffset = $lis.eq(i-1).width();
        var leftTotal = leftOffset + leftTotal;
    
    
        console.log(leftOffset +"/"+ leftTotal);
    }
    

    此部分的输出为:

    11 (the length of the array)
    0 (the initial value of 'totalLeft')
    97/97
    117/214
    90/
    115/NaN
    101/NaN
    138/NaN
    93/NaN
    96/NaN
    102/NaN
    80/NaN
    

    我试过用 parseInt() 一个或两个变量 var leftTotal = leftOffset + leftTotal; each() ,结果完全相同。这并不奇怪,因为我用几乎完全相同的方式赋值。。。

    1. 为什么是 leftTotal 不是数字( NaN )?
    2. 如何添加 的价值 leftOffset 上一次迭代的值 左偏移 ?

    控制台日志 应该 阅读如下内容:

    11
    0
    97/97
    117/214
    90/304
    115/419
    101/520
    138/658
    93/751
    96/847
    102/949
    80/1029
    


    编辑 针对@KennyTM:

    11
    0
    97 "/" "970"
    117 "/" "117970"
    90 "/" "90117970"
    115 "/" "11590117970"
    101 "/" "10111590117970"
    138 "/" "13810111590117970"
    93 "/" "9313810111590117970"
    96 "/" "969313810111590117970"
    102 "/" "102969313810111590117970"
    80 "/" "80102969313810111590117970"
    

    关于@Tomalak:是的,这是一个拼写错误。不幸的是,这是一个打字错误,在我的代码在这里和在真正该死的脚本。。。叹息。。。不过,谢谢你的帮助,这似乎帮了大忙。

    5 回复  |  直到 14 年前
        1
  •  1
  •   Community Egal    7 年前

    您似乎没有分配给 totalLeft 在你的代码里。

    另外,我认为你的代码是 要复杂,要有细微的错误。这是一个更紧凑和jQuery风格的版本。

    var totalLeft = 0;
    
    $('#bookmarks > li:gt(0)').prev().each(function () {
        totalLeft += $(this).width();
    });
    

    the code in your own answer .

        2
  •  4
  •   someGuy    14 年前

    我想试试这样的办法:

    var leftTotal = 0
    $('#bookmarks > li').each( function(){ 
        leftTotal += parseInt(this.width());  // just to be sure its an int :) 
        console.log(this.width(); +"/"+ leftTotal);
    });
    
        3
  •  1
  •   Roman    14 年前

    似乎您没有为下一次迭代保留最后一个值。i、 e-将“var leftTotal”从循环中去掉,这样它将为下一次迭代保留值,您将添加到该值中。

    希望我没弄错:)

        4
  •  0
  •   Praveen Prasad    14 年前
    var totalLeft = 0;
    console.log(totalLeft);
    
    for (i=1; i<numLis; i++) {
        var leftOffset = $lis.eq(i-1).width();
        var leftTotal = parseInt(leftOffset,10) + totalLeft;
    
    
        console.log(leftOffset +"/"+ leftTotal);
    }
    
        5
  •  0
  •   David Thomas    14 年前

    显然,解决方案是对变量名多加注意,并使用parseInt:

    var
    $lis = $('#bookmarks > li'),
    liHeight = parseInt($lis.height()),
    numLis = $lis.length;
    console.log(numLis);
    
    var leftTotal = '0';    // somehow, between creating this var and the loop I started calling it something else 'totalLeft', for no known reason.
    console.log(leftTotal);
    
    for (i=1; i<numLis; i++) {
        var leftOffset = $lis.eq(i-1).width();
        var leftTotal = leftOffset + parseInt(leftTotal);   // added the parseInt here to force it to be a number.      
    
        console.log(leftOffset, "/" , leftTotal);
    }