简体   繁体   English

如何使用javascript从带有记录列表的输入框中获取平均值?

[英]How to get avg values from input boxes with list of records using javascript?

Im a beginner of js... I want to show a list of students. 我是js的初学者...我想显示学生名单。 With this, ppl can edit directly 2 values of grade in input box, and avg grade is auto caculate and inport to 3rd input box. 这样,ppl可以直接在输入框中编辑2个等级值,并且平均等级会自动计算并输入到第3个输入框中。 I could do with 1 ppl, but 2 or more I dont know how to do. 我可以用1 ppl做,但是2或更多我不知道该怎么做。 Could anyone help me? 有人可以帮我吗?

This is my code: https://jsfiddle.net/sxxfrppo/ 这是我的代码: https : //jsfiddle.net/sxxfrppo/

JS: JS:

$(document).ready(function() {
  $('[id^=grade]').on('change', function() {
    var grade = 0;

    $('[id^=grade]').each(function(index) {

      grade += parseFloat($(this).val() ? $(this).val() : 0);
    });

    var avggrade = $('#avg').val(grade.toFixed(2)/2);

  });
});

Element.id should be unique in doucment . Element.iddoucment应该是唯一的。 Substitute duplicate id s beginning with grade , and avg with className s at html . grade代替重复的id ,用html代替classNameavg Use [class*=grade] selector to select all elements where grade is included in className , $(this).closest("tr") to select parent element where change event occurs. 使用[class*=grade]选择器选择在className包括grade所有元素, $(this).closest("tr")选择发生change事件的父元素。

You can also replace ternary $(this).val() ? $(this).val() : 0 您还可以替换三元$(this).val() ? $(this).val() : 0 $(this).val() ? $(this).val() : 0 with +this).value where + operator converts string .value of input element to number. $(this).val() ? $(this).val() : 0 +this).value $(this).val() ? $(this).val() : 0 ,其中+运算符将input元素的字符串.value转换为数字。

 $(document).ready(function() { var grades = $("[class*=grade]") grades.on("change", function() { var grade = 0; var tr = $(this).closest("tr"); $(grades, tr).each(function(index) { grade += +this.value; }); var avggrade = $(".avg", tr).val(grade.toFixed(2) / 2); }); }); 
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <table class="table table-striped table-bordered table-hover"> <thead class=""> <tr> <th width="40" class="text-center"> # </th> <th> Name </th> <th> Grade 1 </th> <th> Grade 2 </th> <th> AVG </th> </tr> </thead> <tbody> <tr> <td></td> <td> Luna </td> <td> <input class="form-control text-right grade1" type="number" min="0" max="10" step="0.01" name="grade1" value="" /> </td> <td> <input class="form-control text-right grade2" type="number" min="0" max="10" step="0.01" name="grade2" value="" /> </td> <td> <input class="form-control text-right avg" type="number" min="0" max="10" step="0.01" name="avg" value="" /> </td> </tr> <tr> <td></td> <td> John </td> <td> <input class="form-control text-right grade1" type="number" min="0" max="10" step="0.01" name="grade1" value="" /> </td> <td> <input class="form-control text-right grade2" type="number" min="0" max="10" step="0.01" name="grade2" value="" /> </td> <td> <input class="form-control text-right avg" type="number" min="0" max="10" step="0.01" name="avg" value="" /> </td> </tr> </tbody> </table> 

jsfiddle https://jsfiddle.net/sxxfrppo/1/ jsfiddle https://jsfiddle.net/sxxfrppo/1/

Using so many id's makes it quite complicated. 使用这么多的ID使其变得相当复杂。 It will only get a lot harder when the number of rows are a lot more. 当行数多得多时,只会变得更加困难。

To make your code flexible, you should be using a class, and some basic jQuery selector functions like closest and find. 为了使您的代码灵活,您应该使用一个类,以及一些基本的jQuery选择器功能,例如close和find。

We can assign a class "grade" to all grade input boxes and a class "avg" to the average input box. 我们可以为所有成绩输入框分配一个“等级”类别,并为平均输入框分配一个“ avg”类别。

Refer to this: https://jsfiddle.net/czvf7L9f/9/ 引用此: https : //jsfiddle.net/czvf7L9f/9/

<tbody>
 <tr>
  <td></td>
  <td>
    Luna
  </td>
  <td>
    <input class="form-control text-right grade" type="number" min="0" max="10" step="0.01" name="grade1" value="" />  <!-- Add grade class -->
  </td>
  <td>
    <input class="form-control text-right grade" type="number" min="0" max="10" step="0.01" name="grade2" value="" /> <!-- Add grade class -->
  </td>
  <td>
    <input class="form-control text-right avg" type="number" min="0" max="10" step="0.01" name="avg" value="" /> <!-- Add avg class -->
  </td>
</tr>
<tr>
  <td></td>
  <td>
    John
  </td>
  <td>
    <input class="form-control text-right grade" type="number" min="0" max="10" step="0.01" name="grade1" value="" /> <!-- Add grade class -->
  </td>
  <td>
    <input class="form-control text-right grade" type="number" min="0" max="10" step="0.01" name="grade2" value="" /> <!-- Add grade class -->
  </td>
  <td>
    <input class="form-control text-right avg" type="number" min="0" max="10" step="0.01" name="avg" value="" /> <!-- Add avg class -->
  </td>
</tr>

$(function(){
   $(".grade").on("change", function() {
   var no_of_boxes = 0;
   var total = 0;
   $(this).closest('tr').find('.grade').each(function() {
       if ($(this).val()) {
         no_of_boxes++;
         total += parseFloat($(this).val())
       }
    });
    var avg = parseFloat(total/no_of_boxes);
    $(this).closest('tr').find('.avg').val(avg);
  });
});

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM