javascript - jQuery 错误中的自动计算

标签 javascript jquery html

.
我尝试计算第 1 列和第 2 列,并且 [] 内的值应考虑。
到目前为止,我能够在使用 split 函数时计算特定列,但出现错误。

例如:在第一个单元格中,我的值带有[],如果我输入时没有[],它的计算正确,它不会进行计算并显示错误

这是我的 fiddle 链接

https://jsfiddle.net/hahkarthick/0y0d4vge/2/

 $(document).ready(function(){
      $('.quantity').on('change, keyup',function(){
           var val=$(this).val();
           console.log(val)
         // To avoid auto inc while pressing arrow keys
           var preVal =$(this).data('val');

          $(this).data('val',val);
         //To avoid auto inc while pressing arrow keys //
     if(val =='' ||  isNaN(val) || val < 1 || val == undefined){
        val = 1;
     }



    $(this).parent().siblings().each(function(){  
        var oldval = $(this).find('.calc').data("val");
        alert(oldval);
        var arr = oldval.split("[");
        console.log(arr);
        //var newval = val * oldval;
        var newval = (val * parseFloat(arr[0])).toFixed(2);

        console.log(newval);
        if(arr.length > 1) {
            newval = newval + "[" + arr[1];
        }

        $(this).find('input').val(newval);
    });
   autoSum();
      });

    autoSum();
    });

    function autoSum(){

        var $dataRows=$("#sum_table tr:not('.total, .title')");
        var totals=[0,0,0];
        $dataRows.each(function() {
            $(this).find('input').each(function(i){        
                totals[i]+=parseFloat( $(this).val());
            });
        });
        $("#sum_table td.totalCol").each(function(i){  
            $(this).html("total:"+totals[i]);
        });

    }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="container">
      <h2>Table calculation</h2>
      <p>Calculaton</p>
      
      <table class="auto_sum table table-hover" id="sum_table">
        <thead>
            <tr class="title">
            <th>value1</th>
            <th>value2</th>
            <th>value3</th>
            <th>Quantity</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td><input data-val="20[2]" class="calc" type="text" data-val="" value="20[2]" name=""></td>
            <td><input class="calc" data-val="[10]" type="number" data-val="" value="10" name=""></td>
            <td><input type="number" data-val="" value="10" name=""></td>
            <td><input class="quantity" type="number" name=""></td>
          </tr>
          <tr>
            <td><input  class="calc" type="number" data-val="" value="5" name=""></td>
            <td><input  class="calc" type="number" data-val="" value="6" name=""></td>
            <td><input type="number" data-val="" value="12" name=""></td>
            <td><input class="quantity" type="number" name=""></td>
          </tr>
          <tr>
            <td><input class="calc"  type="number" data-val="" value="45" name=""></td>
            <td><input  class="calc" type="number" data-val="" value="23" name=""></td>
            <td><input type="number" data-val="" value="22" name=""></td>
            <td><input class="quantity" type="number" name=""></td>
          </tr>
            <tr  class="totalColumn">
              <td class="totalCol">Total:</td>
              <td class="totalCol">Total:</td>
              <td class="totalCol">Total:</td>
              <td></td>
            </tr>
        </tbody>
      </table>
    </div>
提前致谢

最佳答案

参见 fiddle :https://jsfiddle.net/maxbilbow/0y0d4vge/7/

如果 data-val == "",则可能返回未定义。我修改了这一行:

var oldval = $(this).find('.calc').data("val") || "0";

并且,为了安全起见,请将 oldval 转换为 String 以便 split 函数起作用。

var arr = String(oldval).split("[");

我还为 sibling 指定了一个类:

$(this).parent().siblings('.calc-cell')

  $(document).ready(function() {
  $('.quantity').on('change, keyup', function() {
    var val = $(this).val();
    console.log(val)
      // To avoid auto inc while pressing arrow keys
    var preVal = $(this).data('val');

    $(this).data('val', val);
    //To avoid auto inc while pressing arrow keys //
    if (val == '' || isNaN(val) || val < 1 || val == undefined) {
      val = 1;
    }



    $(this).parent().siblings('.calc-cell').each(function() {
      var $calc = $(this).find('.calc');
      var oldval = $calc.data("val") || $calc.val() || "0";
      var arr = String(oldval).split("[");
      console.log(arr);
      //var newval = val * oldval;
      var newval = (val * parseFloat(arr[0])).toFixed(2);

      console.log(newval);
      if (arr.length > 1) {
        newval = newval + "[" + arr[1];
      }

      $(this).find('input').val(newval);
    });
    autoSum();
  });

  autoSum();
});

function autoSum() {

  var $dataRows = $("#sum_table tr:not('.total, .title')");
  var totals = [0, 0, 0];
  $dataRows.each(function() {
    $(this).find('input').each(function(i) {
      totals[i] += parseFloat($(this).val());
    });
  });
  $("#sum_table td.totalCol").each(function(i) {
    $(this).html("total:" + totals[i]);
  });

}
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="container">
  <h2>Table calculation</h2>
  <p>Calculaton</p>

  <table class="auto_sum table table-hover" id="sum_table">
    <thead>
      <tr class="title">
        <th>value1</th>
        <th>value2</th>
        <th>value3</th>
        <th>Quantity</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>
          <input data-val="20[2]" class="calc" type="text" data-val="" value="20[2]" name="">
        </td>
        <td>
          <input class="calc" data-val="[10]" type="number" data-val="" value="10" name="">
        </td>
        <td>
          <input type="number" data-val="10" value="10" name="">
        </td>
        <td>
          <input class="quantity" type="number" name="">
        </td>
      </tr>
      <tr>
        <td class="calc-cell">
          <input class="calc" type="number" data-val="5" value="5" name="">
        </td>
        <td class="calc-cell">
          <input class="calc" type="number" data-val="6" value="6" name="">
        </td>
        <td>
          <input type="number" data-val="" value="12" name="">
        </td>
        <td>
          <input class="quantity" type="number" name="">
        </td>
      </tr>
      <tr>
        <td>
          <input class="calc" type="number" data-val="45" value="45" name="">
        </td>
        <td>
          <input class="calc" type="number" data-val="23" value="23" name="">
        </td>
        <td>
          <input type="number" data-val="" value="22" name="">
        </td>
        <td>
          <input class="quantity" type="number" name="">
        </td>
      </tr>
      <tr class="totalColumn">
        <td class="totalCol">Total:</td>
        <td class="totalCol">Total:</td>
        <td class="totalCol">Total:</td>
        <td></td>
      </tr>
    </tbody>
  </table>
</div>

关于javascript - jQuery 错误中的自动计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46388738/

相关文章:

javascript - JQuery 冲突(也许?)基于单选框隐藏/显示 Div

html - 如果显示一个 div :none?,div 元素中是否允许连续使用相同名称的 anchor

JavaScript 内存泄漏 (Node.js/Restify/MongoDB)

jquery - 将第一个 child 的高度分配给 parent

javascript - 使用 jQuery 保留函数之间的值

javascript - 如何防止伪造的表单验证

javascript - 在 Mootools 中将两个值相加

javascript - 如何在html中使用url参数?

javascript - Uncaught TypeError : core_1. 样式不是函数

html - CSS 位置 :fixed element and margins