【问题标题】:JQuery: form to calculate total of input fields... but several instances of this form on the same pageJQuery:用于计算输入字段总数的表单......但同一页面上有多个此表单的实例
【发布时间】:2012-08-05 08:16:35
【问题描述】:

我在 Stackoverlfow 上花了 20 多个小时来寻找解决问题的方法(尝试组合不同的解决方案),但我仍然卡住了,绝对需要你的帮助!

基本上,我有一个简单的表单,其中包含 3 个“金额”输入字段和一个“总金额”字段(3 个金额的总和)。

这是 HTML 代码:

<table border="1">

    <tr>
        <td>Amount 1</td>
        <td><input class="amount" type="text"/></td>
    </tr>

     <tr>
        <td>Amount 2</td>
        <td><input class="amount" type="text"/></td>
    </tr>

    <tr>
        <td>Amount 3</td>
        <td><input class="amount" type="text"/></td>
    </tr>

    <tr>
        <td>Total Amount</td>
        <td><span class="total">0</span></td>
    </tr>

</table>

然后是工作的 JQuery 代码:

$(document).ready(function(){           
        $('input').each(function() {
            $(this).keyup(function(){   
                calculateTotal();
            });
        });
    });

    function calculateTotal() {
        var sum = 0;
        $('input').each(function() {
            if(!isNaN(this.value) && this.value.length!=0) {
                sum += parseFloat(this.value);
            }
        });

        $(".total").html(sum.toFixed(2));
    }

但是我想在同一个页面中使用同一个表单的多个实例,并且我试图只有一个像我当前的那样的“通用”JQuery 函数,它可以适用于任何表单,即使在同一个页面上, 不会在表单之间混合字段。

基本上,一个函数说“每次更新输入字段时,重新计算总金额并将其放入CURRENT表单/表格的总字段中”

我尝试了不同的方法,特别是用&lt;div&gt; 包围表格,然后通过“currentdiv = $(this).prev("div");"”找到它,然后使用每个函数循环通过“当前 div”。 但每次要么代码不工作,要么其他表单的总字段加起来! 我还尝试了以下类似的方法,但没有使用&lt;div&gt;:

$(this).closest('tr').next().find('span.total').html(sum.toFixed(2));
or
$(this).closest('span.total').html(sum.toFixed(2));
or even
$(this).closest('span').prevAll('.total:first').html(sum.toFixed(2));

提前感谢您的帮助!

【问题讨论】:

  • 您能否向我们展示具有不同表单和输入的示例 html?

标签: jquery sum parent closest


【解决方案1】:

总体上对您的代码进行一些大修。 jQuery 不要求您遍历所有匹配的元素以将侦听器附加到它们。这样就够了:

$(document).ready(function(){           
    $('input.amount').keyup(function(){   
        calculateTotal(this);
    });
});

function calculateTotal( src ) {
    var sum = 0,
        tbl = $(src).closest('table');
    tbl.find('input.amount').each(function( index, elem ) {
        var val = parseFloat($(elem).val());
        if( !isNaN( val ) ) {
            sum += val;
        }
    });
    tbl.find('input.total').html(sum.toFixed(2));
}

请注意,事件处理程序中的 this 关键字不是 jQuery 包装的,AFAIK,就像 .each 处理程序的 elem 参数一样。

【讨论】:

  • 太棒了!您的代码有效 Derija93!我只是放了“tbl.find('.total').html”而不是“tbl.find('input.total').html”(因为我的总字段是跨度而不是输入字段)。非常感谢。我将用完整的解决方案发布答案​​。
  • 我只是明白我暂时无法回答我自己的问题......没关系:只要拿起我的桌子,复制/粘贴多少次就行。然后使用 Derija93 的代码(最后用“tbl.find('.total').html”代替)......看看魔法!再次感谢,感谢所有贡献者!
【解决方案2】:

为什么不直接把包含所有元素的table元素传进去:

calculateTotal(this.parent('table'));//I would set a class on table personally and you need to test this;

然后你有一个参考,你可以使用它来获取正确的输入和跨度,即:

function calculateTotal(el) {
    var sum = 0;
    $(el).find('input').each(function() {
        if(!isNaN(this.value) && this.value.length!=0) {
            sum += parseFloat(this.value);
        }
    });

    $(el).find(".total").html(sum.toFixed(2));
}

【讨论】:

  • 我认为您甚至不必执行 $(el) 您可能只需执行 el.find(...)
  • @11684 是的,但是参数 el 在上面的代码中是一个 jQuery 选择,所以把它包装成一个 jQuery 选择是多余的
  • 是的 find 是 jquery - 只需将 .find 替换为您希望的任何库或纯 js 节点遍历代码。编辑啊 $(el) 部分。 Rune FS 是正确的 - 我已经选择了所以 el 是一个 jQuery 对象,不需要是 $(el) 可以是 el
【解决方案3】:

添加每一行的效果非常好

$(function() {
    $('.ssizeform').each(function() {
        $(this).keyup(function() {
            calculateTotal($(this));
        });
    });
});

function calculateTotal(src) {
    var sum = 0;
    var sumtable = src.closest('tr');

    sumtable.find('.ssizeform').each(function() {
        if(!isNaN(this.value) && this.value.length != 0) {
            sum += parseFloat(this.value);
        }
    });

    sumtable.find(".qty").html(sum.toFixed(0));
}

【讨论】:

    【解决方案4】:

    这样就可以了:

    $(document).ready(function(){           
            $('input').each(function() {
                $(this).keyup(function(){   
                    calculateTotal($(this).closest('table'));
                });
            });
        });
    
        function calculateTotal($tab) {
            var sum = 0;
            $tab.find('input').each(function() {
                if(!isNaN(this.value) && this.value.length!=0) {
                    sum += parseFloat(this.value);
                }
            });
            $tab.find(".total").html(sum.toFixed(2));
        }
    });
    

    【讨论】:

      【解决方案5】:

      我有一个纯 jQuery 解决方案来处理 jsFiddle page。每次更新字段时,它将使用您的标记并查找每个表的总和。

      $("input.amount")
        .keyup(function() {
          total = 0;
          $(this)
            .parents("table")
            .find("input.amount")
              .each(function() {
                  total += parseInt($(this).val());
              })
            .end()
            .find("span.total")
            .html(total);
        });​
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-12-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-27
        • 2021-03-14
        • 2014-01-18
        相关资源
        最近更新 更多