【问题标题】:Get an average total based on form input - with jquery根据表单输入获取平均总数 - 使用 jquery
【发布时间】:2022-01-25 05:00:06
【问题描述】:

我试图获得 8 个表单输入的平均值,而我想出的最好方法是将结果(只读)单元格中的当前总数除以 8。使用我的方法,当用户输入时,在输入所有 8 个必需的输入之前,平均值是不正确的。但好消息是,我发现 [这篇优秀的帖子][1] 几乎对我有用 - 除了它使用表格,脚本在第 3 行引用了它:

$('table tr').each(function() {

..但我的表单对每个输入字段行使用 div。

谁能回答如何调整下面的脚本使其适用于 div 而不是表格?

这是上面链接中的示例:

$(document).ready(function() {
  $(document).on("input", ".kd1", function() {
    $('table tr').each(function() {
      // variables for holding total and count
      var total = 0,
        count = 0;

      // get all input fields and iterate over them
      $('.kd1', this).each(function() {
        // check the value is non-empty
        if (this.value.trim() != '') {
          // increment count for calculating average
          count++;
          // update total based on input value
          // treat input value as 0 if number parsing produces NaN
          total += (Number(this.value.trim()) || 0);
        }
      });
      // calculate and update the average although treat as zero if NaN
      $('.result1', this).val(total / count || 0);
    });
  });

});

和html:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<table class="table">
  <tr>
    <td>
      <input type='text' size='5' class='kd1'>
    </td>
    <td>
      <input type='text' size='5' class='kd1'>
    </td>
    <td>
      <input type='text' size='5' class='kd1'>
    </td>
    <td>
      <input type='text' size='5' class='kd1'>
    </td>
    <td>
      <input type='text' size='5' class='kd1'>
    </td>
    <td>
      <input type='text' size='5' class='result1'>
    </td>
  </tr>
  <tr>
    <td>
      <input type='text' size='5' class='kd1'>
    </td>
    <td>
      <input type='text' size='5' class='kd1'>
    </td>
    <td>
      <input type='text' size='5' class='kd1'>
    </td>
    <td>
      <input type='text' size='5' class='kd1'>
    </td>
    <td>
      <input type='text' size='5' class='kd1'>
    </td>
    <td>
      <input type='text' size='5' class='result1'>
    </td>
  </tr>
</table>

最终解决方案 - 这适用于 DIV:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="avcalc">
    <div>
      <input type='text' size='5' class='kd1'>
    </div>
    <div>
      <input type='text' size='5' class='kd1'>
    </div>
    <div>
      <input type='text' size='5' class='kd1'>
    </div>
    <div>
      <input type='text' size='5' class='kd1'>
    </div>
    <div>
      <input type='text' size='5' class='kd1'>
    </div>
    <div>
      <input type='text' size='5' class='result1'>
    </div>
</div>

$(document).ready(function() {
  $(document).on("input", ".kd1", function() {
    $('div.avcalc').each(function(){
      // variables for holding total and count
      var total = 0,
        count = 0;

      // get all input fields and iterate over them
      $('.kd1', this).each(function() {
        // check the value is non-empty
        if (this.value.trim() != '') {
          // increment count for calculating average
          count++;
          // update total based on input value
          // treat input value as 0 if number parsing produces NaN
          total += (Number(this.value.trim()) || 0);
        }
      });
      // calculate and update the average although treat as zero if NaN
      $('.result1', this).val(total / count || 0);
    });
  });

});

【问题讨论】:

    标签: html jquery forms input calculation


    【解决方案1】:

    我已经进行了一些必要的更改,以使您的 Javascript 与您的 HTML 一起工作。这当前查看页面上的 all &lt;input&gt; 字段;您可能想要更改它以仅查看与计算相关的内容,例如使用$('w-row input') 而不是$('input')

    $(document).ready(function() {
        // If any input field changes:
        $('input').on("change input paste", function() {
            // variables for holding total and count
            var total = 0,
            count = 0;
    
            // get all input fields and iterate over them
            $('input').each(function() {
                // check the value is non-empty
                if (this.value.trim() != '') {
                    // increment count for calculating average
                    count++;
                    // update total based on input value
                    // treat input value as 0 if number parsing produces NaN
                    total += (Number(this.value.trim()) || 0);
                }
            });
            // calculate and update the average although treat as zero if NaN
            console.log(total / count || 0);
        });
    });
    

    【讨论】:

    • 嗨,非常感谢您花时间看这个:) 我尝试了您修改的 js 例程并替换为总行以显示平均值,但得到了一些奇怪的结果,尤其是在删除一个值之后然后重新添加。上面的 TD 版本确实可以完美运行,但如前所述,我需要丢失表格(并在 js 中引用)。我在原始问题中添加了一个简化的例程,但在第 3 行中,我尝试将 td 切换为 div - $('
      ').each(function() { - 但它不起作用。您知道如何更改它以使 html 平均化(作为变量 result1)吗?谢谢。
    • @PNEWest 您能否更具体地说明“奇怪的结果”是什么意思?究竟是什么问题? “删除一个值然后重新添加”是什么意思,为什么需要这样做?至于你修改后的$('div').each()...,没有必要循环遍历每个&lt;div&gt;,然后循环遍历其中的每个&lt;input&gt;,你可以循环遍历每个&lt;input&gt;并完成它,所以我会说你原来的代码是不必要的复杂。
    • @PNEWest $("input#result") 将选择 id 为“result”的&lt;input&gt; 字段。你的&lt;input type='text' size='5' class='result1'&gt; 不仅没有ID,而且它的类名是“result1”,而不是“result”。我建议您编辑原始问题以包含问题的minimal reproducible example,而不是尝试在 cmets 中零敲碎打地做这个。
    • @PNEWest 请edit your question 显示您需要帮助的当前代码。当代码随时间变化或消失时,包含指向外部代码的链接对未来的读者没有帮助。
    • 解决方案添加了上面的原始问题。
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签