如何使 jQuery 函数迭代从同一类中的 2 个列表中获取的单独数组?

Posted

技术标签:

【中文标题】如何使 jQuery 函数迭代从同一类中的 2 个列表中获取的单独数组?【英文标题】:How can I make a jQuery function iterate over separate arrays taken from 2 lists in the same class? 【发布时间】:2019-12-11 11:32:58 【问题描述】:

非常抱歉,如果标题令人困惑,我对 javascript/jQuery 很陌生,我还没有真正掌握术语。我负责一个游戏小组,并试图跟踪每个成员的积分。为简单起见,我现在只使用两个列表,一个用于 Suzy 的积分,另一个用于 Billy 的积分。

我目前有一个函数可以将点数相加(它采用 html 列表项中包含的任何粗体文本并对值求和)并在每个列表下的指定 div 中返回总和。问题是它返回的是所有点的总和(在两个列表中),而不是那个人的点。

$(".person").each(function() 
  var arr = [];
  $("li b").each(function() 
    arr.push($(this).text());
  )
  var total = 0;
  for (var i = 0; i < arr.length; i++) 
    total += arr[i] << 0;
  
  $(".total").text("Total: " + total);

);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="member">
  <div class="points">
    <ul class="person" id="suzy">
      <h1>Suzy</h1>
      <li><b>40</b> points</li>
      <li><b>50</b> points</li>
    </ul>
  </div>
  <div class="total" style="background:orange"></div>
</div>

<div class="member">
  <div class="points">
    <ul class="person" id="billy">
      <h1>Billy</h1>
      <li><b>10</b> points</li>
      <li><b>20</b> points</li>
    </ul>
  </div>
  <div class="total" style="background:orange"></div>
</div>

我了解代码出了什么问题,但我对 jQuery 的了解还不够,无法弄清楚我需要用什么来替换它。基本上,我该怎么做才能使从第三行中的 $("lib") 创建的数组仅限于出现在 中指定的特定“.person”元素中的“lib”实例第一行

【问题讨论】:

请注意&lt;h1&gt;&lt;ul&gt; 的无效子代 【参考方案1】:

您需要使用$(this) 来引用您正在循环的.person。例如,使用$(this).find("li b").each 代替$("li b").eachtotal 计算的放置逻辑相同:

$(".person").each(function() 
  var arr = [];
  $(this).find("li b").each(function() 
    arr.push($(this).text());
  )
  var total = 0;
  for (var i = 0; i < arr.length; i++) 
    total += arr[i] << 0;
  
  $(this).closest('.member').find(".total").text("Total: " + total);

);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="member">
  <div class="points">
    <ul class="person" id="suzy">
      <h1>Suzy</h1>
      <li><b>40</b> points</li>
      <li><b>50</b> points</li>
    </ul>
  </div>
  <div class="total" style="background:orange"></div>
</div>

<div class="member">
  <div class="points">
    <ul class="person" id="billy">
      <h1>Billy</h1>
      <li><b>10</b> points</li>
      <li><b>20</b> points</li>
    </ul>
  </div>
  <div class="total" style="background:orange"></div>
</div>

【讨论】:

【参考方案2】:

因为$(".total") 有 2 个匹配项,所以您在两个位置都得到相同的数字。

另外,这里不需要数组。它只会使代码更复杂,并且存储数据的第二个副本没有任何意义 - 现在您必须确保数组数据与 HTML 数据保持同步。相反,只需从 HTML 中获取数据。

现在,您遇到了一些 HTML 验证问题:

h1 不允许在 ul 内。 b 元素不应仅用于样式设置。

因此,您将不得不调整您的 HTML。而且,如果您交换关闭的points divtotal div,解决方案会变得更容易一些。有关详细信息,请参阅下面的 cmets:

$(".person").each(function()
  var total = 0;
  // Loop over only the points for the current person, not all the points
  // The second argument passed to JQuery provides context for where to 
  // limit the first argument query. "this" refers to the current person
  // that the loop is iterating over, so you only are adding up one person's
  // points, not both.
  $("span.points", this).each(function()
    // No JQuery needed here. Just convert the text of "this", which now (because
    // we are in a different loop) points to the span that we're looping over, 
    // to a number and add it to the total
    total += +this.textContent;
  );
  // No JQuery needed here either. Just set the text of the next sibling of 
  // the person we were looping over (now the total div) to the total.
  this.nextElementSibling.textContent = "Total: " + total;
);
/* Do styling with CSS classes rather than inline styles */
li span.points  font-weight:bold; 
.total background:orange; 
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="member">
  <div class="points">
    <h1>Suzy</h1>
    <ul class="person">
      <li><span class="points">40</span> points</li>
      <li><span class="points">50</span> points</li>
    </ul>
    <div class="total"></div>
  </div>
</div>

<div class="member">
  <div class="points">
    <h1>Billy</h1>
    <ul class="person">
      <li><span class="points">10</span> points</li>
      <li><span class="points">20</span> points</li>
    </ul>
    <div class="total"></div>
  </div>
</div>

【讨论】:

以上是关于如何使 jQuery 函数迭代从同一类中的 2 个列表中获取的单独数组?的主要内容,如果未能解决你的问题,请参考以下文章

如何从同一个类中的方法访问类数据成员[重复]

在java中怎样使方法调用同一个类中的方法是啥?

如何使用php在同一类中的另一个函数中使用一个函数[关闭]

如何从rails中的视图将值传递给jquery?

同一类中的 jQuery 复选框验证

如何将一个类函数传递给同一个类中的另一个?