【问题标题】:Take sum of input textbox columns based on drop down value selected根据选择的下拉值获取输入文本框列的总和
【发布时间】:2020-11-28 14:19:07
【问题描述】:

我是 Jquery 的初学者。在以下问题上需要您的帮助。 我有一个 3 列和 3 行的 html 表。每列都有一个标题示例 col1、col2 和 col3。有一个列批准状态,其值为:已批准、待批准和未批准。我必须取用户在每列的每个文本框中输入的值的总和。目前在我的代码中,我正在为每一列取那个总和。但我只想在审批状态为“已批准”时才取款。我不确定要使用哪个事件处理程序,因为用户可以先输入数字或批准状态随机顺序。谢谢!

<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>
<style>
input {display: block;}
input.total {margin-top: 30px;}
[class*="total"] {
  background: #ffff00;
  p.double {border-style: double;}
}
.none{
display:none;
}
</style>
</head>
<body>
<table class="aa">
<th> Approval status</th>
<th>col1</th>
<th>col2</th>
<th>col3</th>
<tr>
<td id="selectBox1">
<select id = "myList1">
<option value = "1">Choose Approval Status</option>
<option value = "2">Approved</option>
<option value = "3">Approval Pending</option>
<option value = "4">Not Approved</option>
</select>
</td>
<td> <input type="text" class="qty1" value="" /> </td>
<td> <input type="text" class="qty2" value="" /> </td>
<td> <input type="text" class="qty3" value="" /> </td>
</tr>
<tr>
<td id="selectBox2">
<select id = "myList2">
<option value = "1">Choose Approval Status</option>
<option value = "2">Approved</option>
<option value = "3">Approval Pending</option>
<option value = "4">Not Approved</option>
</select>
</td>
<td> <input type="text" class="qty1" value="" /> </td>
<td> <input type="text" class="qty2" value="" /> </td>
<td> <input type="text" class="qty3" value="" /> </td>
</tr>
<tr>
<td>  <input type="text" class="none" value="" /></td>
<td>  <input type="text" class="total1" value="" /> </td>
<td>  <input type="text" class="total2" value="" /> </td>
<td>  <input type="text" class="total3" value="" /> </td>
 </tr>
</table>
<script>
$(document).on("change", ".qty1", function() {
    var sum = 0;
    $(".qty1").each(function(){
        sum += +$(this).val();
    });
    $(".total1").val("total:" + sum);
});
$(document).on("change", ".qty2", function() {
    var sum = 0;
    $(".qty2").each(function(){
        sum += +$(this).val();
    });
    $(".total2").val("total:" + sum);
});
$(document).on("change", ".qty3", function() {
    var sum = 0;
    $(".qty3").each(function(){
        sum += +$(this).val();
    });
    $(".total3").val("total:" + sum);
});
</script>

</body>
</html>

【问题讨论】:

  • 你为什么要多次使用#selectBox#myList? ID 应该是唯一的
  • 只有 1 个“审批状态”选择元素似乎更合乎逻辑。请详细说明为什么有3个。如果需要3个,应该什么时候相加?当所有 3 个都获得批准时?
  • 查看我的回答希望对您有所帮助
  • @Rob Moll:我已经编辑了代码。抱歉造成混淆。最后一个下拉菜单是额外的。对于具有用户输入的文本框的每一行,都会有下拉菜单,用户将选择是否批准。然后我只需要在最后一个框中显示已批准状态的文本框的总和。谢谢!

标签: javascript html jquery html-table css-selectors


【解决方案1】:

只需将选择的值从数字替换为与innerHTML 中相同的文本,然后 使用 if($('#myList1').val() == 'Approved') 之类的 if 语句,以便仅在 if 语句为真时计算总和

$(document).on('change', '.qty1', () => {
  if ($('#myList1').val() == 'Approved') {
    var sum = 0;
    $(".qty1").each(function() {
      sum += +$(this).val();
    });
    $(".total1").val("total:" + sum);
  }
});
$(document).on('change', '.qty2', () => {
  if ($('#myList2').val() == 'Approved') {
    var sum = 0;
    $(".qty2").each(function() {
      sum += +$(this).val();
    });
    $(".total2").val("total:" + sum);
  }
});
$(document).on('change', '.qty3', () => {
  if ($('#myList3').val() == 'Approved') {
    var sum = 0;
    $(".qty3").each(function() {
      sum += +$(this).val();
    });
    $(".total3").val("total:" + sum);
  }
});
input {
  display: block;
}

input.total {
  margin-top: 30px;
}

[class*="total"] {
  background: #ffff00;
  p.double {
    border-style: double;
  }
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<table class="aa">
  <th> Approval status</th>
  <th>col1</th>
  <th>col2</th>
  <th>col3</th>
  <tr>
    <td id="selectBox">
      <select id="myList1">
        <option value="none" selected>Choose Approval Status</option>
        <option value="Approved">Approved</option>
        <option value="Approval Pending">Approval Pending</option>
        <option value="Not Approved">Not Approved</option>
      </select>
    </td>
    <td> <input type="text" class="qty1" value="" /> </td>
    <td> <input type="text" class="qty2" value="" /> </td>
    <td> <input type="text" class="qty3" value="" /> </td>
  </tr>
  <tr>
    <td id="selectBox">
      <select id="myList2">
        <option value="none">Choose Approval Status</option>
        <option value="Approved">Approved</option>
        <option value="Approval Pending">Approval Pending</option>
        <option value="Not Pending">Not Approved</option>
      </select>
    </td>
    <td> <input type="text" class="qty1" value="" /> </td>
    <td> <input type="text" class="qty2" value="" /> </td>
    <td> <input type="text" class="qty3" value="" /> </td>
  </tr>
  <tr>
    <td id="selectBox">
      <select id="myList3">
        <option value="none">Choose Approval Status</option>
        <option value="Approved">Approved</option>
        <option value="Approval Pending">Approval Pending</option>
        <option value="Not Pending">Not Approved</option>
      </select>
    </td>
    <td> <input type="text" class="total1" value="" /> </td>
    <td> <input type="text" class="total2" value="" /> </td>
    <td> <input type="text" class="total3" value="" /> </td>
  </tr>
</table>

【讨论】:

  • 感谢您的回复。代码没有按预期工作;无论选择的状态如何,它都会为所有人收取总和,而不仅仅是批准的状态。
【解决方案2】:

您的 sn-p 中有太多代码。通过减少它,您可以使其可重复使用。此外,您并不需要所有这些 idclass-attributes 来管理您的脚本。

以下脚本可以应用于任何大小的表格。

$("table.aa").on("change input",ev=>            // act on both: "change" and "input"
  $("table.aa tr:last td:gt(0)").each((i,td)=>  // go over each result input field
    $('input',td).val(                          // and set its value to:
      $("table.aa tr")                          // find all rows ...
       .filter((j,tr)=>$("select",tr).val()==2) // but only those having a select==2
       .find("input:eq("+i+")").toArray()       // take i-th input in each row
       .reduce((a,c)=>+c.value+a,0)             // and accumulate all values
    ) 
  )
)
input {display: block;}
.total {
  background: #ffff00;
  p.double {border-style: double;}
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<table class="aa">
<th> Approval status</th>
<th>col1</th>
<th>col2</th>
<th>col3</th>
<tr>
<td>
<select>
<option value = "1">Choose Approval Status</option>
<option value = "2">Approved</option>
<option value = "3">Approval Pending</option>
<option value = "4">Not Approved</option>
</select>
</td>
<td> <input type="text"/> </td>
<td> <input type="text"/> </td>
<td> <input type="text"/> </td>
</tr>
<tr>
<td>
<select>
<option value = "1">Choose Approval Status</option>
<option value = "2">Approved</option>
<option value = "3">Approval Pending</option>
<option value = "4">Not Approved</option>
</select>
</td>
<td> <input type="text"/> </td>
<td> <input type="text"/> </td>
<td> <input type="text"/> </td>
</tr>
<tr>
<td>
<select>
<option value = "1">Choose Approval Status</option>
<option value = "2">Approved</option>
<option value = "3">Approval Pending</option>
<option value = "4">Not Approved</option>
</select>
</td>
<td> <input type="text"/> </td>
<td> <input type="text"/> </td>
<td> <input type="text"/> </td>
</tr>
<tr>
<td>  </td>
<td>  <input type="text" class="total" value="" /> </td>
<td>  <input type="text" class="total" value="" /> </td>
<td>  <input type="text" class="total" value="" /> </td>
 </tr>
</table>

【讨论】:

  • 非常感谢您的帮助。这完全符合需要。您的回复非常有用。
  • 是的,这就是 jQuery 的好处:你几乎总是知道什么时候走在正确的道路上,因为这样你就“少写,多做”。 ;-)
【解决方案3】:

这是满足您要求的一种解决方案,它将在最终行下拉值更改的帮助下根据每行的状态输出值的总和。

$(".finalState").on("change", function() {
            if($(this).val() == 2) {
              var t1 = t2 = t3 = 0;
              var tTR = $(this).parents("tbody").find("tr");
              tTR.each(function(){
                if(!$(this).hasClass("total-row") && $(this).find(".myList").val()==2){
                  var qty1 = $(this).find(".qty1").val();
                  if(!isNaN(qty1) && qty1 !== null && qty1 !== '' ){
                    t1 = (parseFloat(t1) + parseFloat($(this).find(".qty1").val()));
                  }
                  
                  var qty2 = $(this).find(".qty2").val();
                  if(!isNaN(qty2) && qty2 !== null && qty2 !== '' ){
                    t2 = (parseFloat(t2) + parseFloat($(this).find(".qty2").val()));
                  }
                  
                  var qty3 = $(this).find(".qty3").val();
                  if(!isNaN(qty3) && qty3 !== null && qty3 !== '' ){
                    t3 = (parseFloat(t3) + parseFloat($(this).find(".qty3").val()));
                  }
                }
              });
            } else if($(this).val() == 3) {
              var t1 = t2 = t3 = 0;
              var tTR = $(this).parents("tbody").find("tr");
              tTR.each(function(){
                if(!$(this).hasClass("total-row") && $(this).find(".myList").val()==3){
                  var qty1 = $(this).find(".qty1").val();
                  if(!isNaN(qty1) && qty1 !== null && qty1 !== '' ){
                    t1 = (parseFloat(t1) + parseFloat($(this).find(".qty1").val()));
                  }
                  
                  var qty2 = $(this).find(".qty2").val();
                  if(!isNaN(qty2) && qty2 !== null && qty2 !== '' ){
                    t2 = (parseFloat(t2) + parseFloat($(this).find(".qty2").val()));
                  }
                  
                  var qty3 = $(this).find(".qty3").val();
                  if(!isNaN(qty3) && qty3 !== null && qty3 !== '' ){
                    t3 = (parseFloat(t3) + parseFloat($(this).find(".qty3").val()));
                  }
                }
              });
            } else if($(this).val() == 4){
              var t1 = t2 = t3 = 0;
              var tTR = $(this).parents("tbody").find("tr");
              tTR.each(function(){
                if(!$(this).hasClass("total-row") && $(this).find(".myList").val()==4){
                  var qty1 = $(this).find(".qty1").val();
                  if(!isNaN(qty1) && qty1 !== null && qty1 !== '' ){
                    t1 = (parseFloat(t1) + parseFloat($(this).find(".qty1").val()));
                  }
                  
                  var qty2 = $(this).find(".qty2").val();
                  if(!isNaN(qty2) && qty2 !== null && qty2 !== '' ){
                    t2 = (parseFloat(t2) + parseFloat($(this).find(".qty2").val()));
                  }
                  
                  var qty3 = $(this).find(".qty3").val();
                  if(!isNaN(qty3) && qty3 !== null && qty3 !== '' ){
                    t3 = (parseFloat(t3) + parseFloat($(this).find(".qty3").val()));
                  }
                }
              });
            }
            $(".total1").val(t1);
            $(".total2").val(t2);
            $(".total3").val(t3);
        });
input {display: block;}
        input.total {margin-top: 30px;}
        [class*="total"] {
        background: #ffff00;
        p.double {border-style: double;}
        }
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>
<html>
    <head>
    </head>
    <body>
    <table class="aa">
      <thead>
        <tr>
            <th>col1</th>
            <th>col2</th>
            <th>col3</th>
            <th>Approval status</th>
        </tr>
      </thead>
      <tbody>
        <tr>
            <td> <input type="text" class="qty1" value="" /> </td>
            <td> <input type="text" class="qty2" value="" /> </td>
            <td> <input type="text" class="qty3" value="" /> </td>
            <td class="selectBox">
                <select class= "myList">
                    <option value = "1">Choose Approval Status</option>
                    <option value = "2">Approved</option>
                    <option value = "3">Approval Pending</option>
                    <option value = "4">Not Approved</option>
                </select>
            </td>
        </tr>
        <tr>
            <td> <input type="text" class="qty1" value="" /> </td>
            <td> <input type="text" class="qty2" value="" /> </td>
            <td> <input type="text" class="qty3" value="" /> </td>
            <td class="selectBox">
                <select class="myList">
                    <option value = "1">Choose Approval Status</option>
                    <option value = "2">Approved</option>
                    <option value = "3">Approval Pending</option>
                    <option value = "4">Not Approved</option>
                </select>
            </td>
        </tr>
        <tr>
            <td> <input type="text" class="qty1" value="" /> </td>
            <td> <input type="text" class="qty2" value="" /> </td>
            <td> <input type="text" class="qty3" value="" /> </td>
            <td class="selectBox">
                <select class="myList">
                    <option value = "1">Choose Approval Status</option>
                    <option value = "2">Approved</option>
                    <option value = "3">Approval Pending</option>
                    <option value = "4">Not Approved</option>
                </select>
            </td>
        </tr>
        <tr class="total-row">
            <td>  <input type="text" class="total1" value="" /> </td>
            <td>  <input type="text" class="total2" value="" /> </td>
            <td>  <input type="text" class="total3" value="" /> </td>
            <td class="selectBox">
                <select class = "myList finalState">
                    <option value = "1">Choose Approval Status</option>
                    <option value = "2">Approved</option>
                    <option value = "3">Approval Pending</option>
                    <option value = "4">Not Approved</option>
                </select>
            </td>
        </tr>
      </tbody>
    </table>
    </body>
</html>

【讨论】:

    猜你喜欢
    • 2014-10-02
    • 1970-01-01
    • 2019-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多