【问题标题】:jQuery .each loop with simple math not giving individual resultsjQuery .each 循环与简单的数学不给出单独的结果
【发布时间】:2018-01-18 00:33:22
【问题描述】:

我正在尝试遍历每个 .student-item div,从每个 .student-item 中的各种数字计算一堆不同的值(数字不需要更改),并输出新文本和/或添加/使用这些值修改 CSS 样式。

问题

  1. 虽然.each 似乎在工作——我在循环的每个主要部分之后将消息记录到控制台,我看到每个有 10 个,这是正确的项目数——见 #2下面。
  2. 数学不工作(因此.else 循环?)。我还记录了其中一个变量,scoreChangeNum,其中包含一些 简单 数学,只有在满足一个 .hasClass 条件时才会显示(这应该适用于 .student-items 中的 7 个这个案例)。您还将看到 +-8 ytd 文本。此文本在 scoreChangeNum 变量中计算并附加到跨度内。计算错误(每个数字应该在 ~10 到 ~300 之间)并且是为每个 .student-item 编写的(它们应该都是不同的)。
  3. 我添加到某些元素的 css 并没有将它们移动到应有的位置。我猜是因为数学似乎不对..?位置(和某些元素的宽度)应由不同元素内的数字确定。

这有意义吗?对不起,跑步。希望得到一些关于这里出了什么问题的提示。让我知道是否有任何不清楚的地方。谢谢!

编辑(在此处添加代码。):

HTML(但.student-item 共有 10 个)

<div class="students-list">
  <div class="student-item">
    <a href="#" class="name">Jim Wise</a>
    <div class="score-bar">
      <div class="scores">
        <div class="current-score point">180</div>
        <div class="orig-score-arrow"></div>
        <div class="orig-score">80</div>
        <div class="score-change">+<span class="score-change-amount">nnn</span> ytd</div>
      </div>
      <ul id="markings">
        <li>&nbsp;</li>
        <li>&nbsp;</li>
        <li>&nbsp;</li>
        <li>&nbsp;</li>
        <li>&nbsp;</li>
        <li>&nbsp;</li>
        <li>&nbsp;</li>
        <li>&nbsp;</li>
        <li>&nbsp;</li>
        <li>&nbsp;</li>
        <li>&nbsp;</li>
        <li>&nbsp;</li>
        <li>&nbsp;</li>
      </ul>
    </div>
    <div class="print-icon"></div>
  </div>
  <div class="student-item">
    <a href="#" class="name">Frank Owens</a>
    <div class="score-bar">
      <div class="scores">
        <div class="current-score point">280</div>
        <div class="orig-score-arrow"></div>
        <div class="orig-score">100</div>
        <div class="score-change">+<span class="score-change-amount">nnn</span> ytd</div>
      </div>
      <ul id="markings">
        <li>&nbsp;</li>
        <li>&nbsp;</li>
        <li>&nbsp;</li>
        <li>&nbsp;</li>
        <li>&nbsp;</li>
        <li>&nbsp;</li>
        <li>&nbsp;</li>
        <li>&nbsp;</li>
        <li>&nbsp;</li>
        <li>&nbsp;</li>
        <li>&nbsp;</li>
        <li>&nbsp;</li>
        <li>&nbsp;</li>
      </ul>
    </div>
    <div class="print-icon"></div>
  </div>
</div>

jQuery

$(document).ready(function() {

  var studentItem = '.student-item';

  $(studentItem).each(function(){
    console.log('"each" function - CHECK');

    var currentScoreElement = '.current-score',
        origScoreArrow = '.orig-score-arrow',
        origScoreElement = '.orig-score',
        origScoreNum = parseInt($(origScoreElement).text()),
        origScorePos = parseInt(origScoreNum * .48),
        scoreChangeSpan = '.score-change-amount';

    console.log('initial variables - CHECK');

    if ( $(currentScoreElement).hasClass('point') ) {
      var currentScoreNum = parseInt($(currentScoreElement).text()),
      currentScorePointPos = parseInt(currentScoreNum * .48),
      origScoreArrowWidth = parseInt((currentScorePointPos - origScorePos) * .9),
      scoreChangeNum = parseInt(currentScoreNum - origScoreNum);

      console.log(scoreChangeNum);

      $(currentScoreElement).css({ 'left': currentScorePointPos + 'px' });
      $(origScoreElement).css({ 'left': origScorePos + 'px' });
      $(origScoreArrow).css({ 'left': origScorePos + 'px', 'width': origScoreArrowWidth + 'px' });
      $(scoreChangeSpan).text(scoreChangeNum);
      $(scoreChangeSpan).css({ 'left': parseInt(currentScorePointPos - 12) + 'px'     });

    } else if ( $(currentScoreElement).hasClass('range') ) {
      var currentRangeStart = parseInt($(currentScoreElement).find('.start').text()),
      currentRangeEnd = parseInt($(currentScoreElement).find('.end').text()),
      currentRangeWidth = parseInt(currentRangeEnd - currentRangeStart),
      currentRangeAvg = parseInt((currentRangeStart + currentRangeEnd) / 2);
      origScoreArrowWidth = parseInt(currentRangeAvg - origScorePos),
      scoreChangeNum = parseInt(currentScoreNum - origScoreNum);

      $(currentScoreElement).css({ 'left': currentRangeStart + 'px', 'width': currentRangeWidth + 'px' });
      $(origScoreElement).css({ 'left': origScorePos + 'px' });
      $(origScoreArrow).css({ 'left': origScorePos + 'px', 'width': origScoreArrowWidth + 'px' });
      $(scoreChangeSpan).text(scoreChangeNum);
      $(scoreChangeSpan).css({ 'left': parseInt(currentRangeAvg - 12) + 'px' });
    }

  });

});

【问题讨论】:

  • 您应该可以在此处添加/嵌入您的代码作为工作版本,从而避免其他人不得不离开页面 :-) 不确定,但您在 parseInt parseInt(currentScoreNum * .48) 中有此计算,您可以试试吗就像parseInt(currentScoreNum) * .48
  • 项目只是包含很多代码,所以我选择简洁而不是离开页面。我尝试了parseInt(currentScoreNum) * .48 而不是parseInt(currentScoreNum * .48),但它似乎并没有改变数学。
  • 如果你注销所有的值,例如 origScoreNum 值,我得到值 8.01004202408032e+27??
  • 是的,我也为origScoreNum 得到了这个。您可以在 html 中看到,数学不应该接近那么高——我计算的数字都不超过 ~600,并且任何乘法都是分数(例如 0.48 等)。这就是问题的全部,真的。
  • 当我输出 $(origScoreElement).text() 我得到 8010042024080320290510420550 si 正确吗?

标签: jquery css math each


【解决方案1】:

问题是$(origScoreElement) 正在选择页面上的所有 div.orig-score 元素,而 .text() 正在返回第一个的文本。您只需要选择作为当前 div.student-item 子项的 div.orig-score,使用 $(origScoreElement, this)

【讨论】:

  • 既然变量origScoreElement被设置为字符串“.orig-score”,那么$(origScoreElement)不应该和$(".orig-score")一样吗?我认为因为它在.each 循环内,所以它只会在每个.student-item 中抓取一个.orig-score。那么我应该用$(**variable**, this) 语法替换对此类变量的任何使用吗?
  • @dmoz 是什么让您认为在 .each() 循环内会限制选择器在该元素内进行搜索?
  • $(origScoreElement) 将选择页面上所有匹配的元素,无论代码出现在哪里。范围选择器 $(origScoreElement, this) 只会选择指定范围内的元素(this 的子级)。
  • @dmoz 如果只想在当前循环元素中搜索,则需要明确地说出来,$(this).find(origScoreElement)$(origScoreElement, this)
  • 我想我认为这就是.else 循环所做的事情——循环遍历执行循环内任务的每个元素,直到没有更多元素可以循环。您对答案有什么建议吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-01
  • 2014-01-30
  • 2011-08-07
  • 1970-01-01
  • 2015-07-18
相关资源
最近更新 更多