【问题标题】:How to continuously add to a variable on iteration of a for-loop, with jQuery?如何使用jQuery在for循环的迭代中不断添加变量?
【发布时间】:2010-09-25 08:17:56
【问题描述】:

我正在尝试将 jQuery (1.4.2) 中 for 循环的每次迭代中的数字增加前一个元素的宽度。

我尝试了以下方法:

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

我尝试在var leftTotal = leftOffset + leftTotal; 变量赋值中使用parseInt() 左右一个和两个变量,但无济于事。我也尝试过使用 jQuery 的each(),结果完全相同。这并不奇怪,因为我以几乎完全相同的方式分配值......

这里有两个问题:

  1. 为什么leftTotal 不是数字 (NaN)?
  2. 如何将leftOffset 值添加到上一次迭代的leftOffset 值中?

控制台日志应该如下所示:

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


编辑回应@KennyTM:

Console.log 输出现在(更有希望):

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

关于@Tomalak:是的,这是一个错字。可悲的是,这在我的代码和真正的脚本中都是一个错字。 ......叹气......不过,感谢您的收获,这似乎帮了很多忙。

...多么尴尬。 =)

【问题讨论】:

  • 你没有分配给totalLeft是一个错字吗?
  • @Tomalak,+1 因为我比我更关注我的 jQuery... =) 从那以后,偷偷摸摸的 parseInt() 解决了我的问题,我很乐意接受你的评论一个答案,如果你愿意这样发布?
  • 嗯。完毕。显然为时已晚。你也接受了一个不可能的答案。

标签: javascript jquery for-loop


【解决方案1】:

我会尝试这样的:

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

【讨论】:

  • 您可以(应该)使用this.width 而不是$(this).width()
  • 哦,谢谢 :) 我自己是 jq 的新手 :)
  • @Tomalak:不,li 元素没有 width 属性。
  • @someGuy,我假设console.log... 行中的第一个分号是错字,还是我没听懂?
【解决方案2】:

您的代码中似乎没有分配给totalLeft

另外,我认为您的代码方式 很复杂并且有细微的错误。这是一个更紧凑和 jQuery 风格的版本。

var totalLeft = 0;

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

至少,这会生成与the code in your own answer 相同的数字。

【讨论】:

    【解决方案3】:

    看来您没有为下一次迭代保留最后一个值。即 - 将“var leftTotal”置于循环之外,这样它将保留下一次迭代的值,您将添加到它。

    希望我没听错:)

    【讨论】:

    • 我在循环之外创建了变量,但将其命名为totalLeft。然后,出于某种原因,在循环内部将其称为leftTotal。这似乎是问题的症结所在。但建议 +1。
    【解决方案4】:
    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】:

      显然,解决方案是更加注意变量名,并使用 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);
      }
      

      感谢@Tomalak 发现了我的临床失明... =)

      【讨论】:

      • 你为什么把leftTotal当作一个字符串?只需将其初始化为整数零,您就可以删除奇怪的parseIntheight()width() 返回纯整数,您不需要解析任何内容。 (否则,请始终使用 parseInt(..., 10) 以确保您不会被臭名昭著的前导零均值八进制陷阱抓住。)
      • someguy 的解决方案比这更清楚。如果它也是正确的,你应该选择那个而不是这个。此外,您在for (i=1...) 中缺少var,为了清楚起见,您应该将声明var leftTotal 移到循环之外
      • @贾斯汀,完成。 @Bob ......老实说?我不知道,我认为,在某一时刻,console.log(variable) 返回了38px,并且我认为“px”部分需要 parseInt()...我想我只是在某个地方感到非常困惑。跨度>
      • width() 的返回值始终是 int。 CSS 属性的值可能包含px,但您在这里没有使用它。再说一次,CSS 属性的值也可能包含em%,所以无论如何你都不会使用“parseInt()”。
      • 是的,css('width') 以 CSS length 格式返回宽度,可能带有一个尾随单元,如 pxwidth() 始终是整数屏幕像素。
      猜你喜欢
      • 2020-05-04
      • 2018-05-23
      • 2022-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多