2017-09-08 20 views
1

フォームフィールドを動的に追加する必要があります。入力値の各グループには、quantity,price、およびtotalの3つのフィールドが含まれています。 quantitypriceに数値を入力するたびに、フィールドtotalには合計が表示されなければなりません。動的フォーム複数入力フィールドの計算

私はこれを認識しましたが、最初のフィールドでのみ動作します。フィールドの別の行を追加すると、他の行が計算されません。

ここに私のコードです。あなたは1つのDOMでユニークid属性を使用する必要があります

$(document).ready(function() { 
 
    var i = 1; 
 
    $('#add').click(function() { 
 
\t  i++; 
 
\t  $('#articles').append('<tr id="row' + i + '"><td><input type="number" id="quantity" name="quantity[]" placeholder="quantity" class="form-control name_list" /></td> <td><input type="number" id="price" name="price[]" placeholder="price" class="form-control name_list" /></td> <td><input type="number" id="total" name="total[]" placeholder="total" class="form-control name_list" readonly /></td> <td><button type="button" name="remove" id="' + i + '" class="btn btn-danger btn_remove">X</button></td></tr>'); 
 
    }); 
 

 
    $(document).on('click', '.btn_remove', function() { 
 
\t  var button_id = $(this).attr("id"); 
 
\t  $('#row' + button_id + '').remove(); 
 
    }); 
 

 
    $('#submit').click(function() { 
 
\t  //alert($('#add_name').serialize()); //alerts all values and works fine   
 
\t  $.ajax({ 
 
\t \t  url: "wwwdb.php", 
 
\t \t  method: "POST", 
 
\t \t  data: $('#add_name').serialize(), 
 
\t \t  success: function(data) { 
 
\t \t \t  $('#add_name')[0].reset(); 
 
\t \t  } 
 
\t  }); 
 
    }); 
 

 
    function upd_art() { 
 
\t  var qty = $('#quantity').val(); 
 
\t  var price = $('#price').val(); 
 
\t  var total = (qty * price).toFixed(2); 
 
\t  $('#total').val(total); 
 
    } 
 
    setInterval(upd_art, 1000); 
 
});
<html> 
 
<head> 
 
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js"></script> 
 
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" /> 
 
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script> 
 
</head> 
 
<body> 
 
    <div class="container"> 
 
    <br /> 
 
    <br /> 
 
    <h2 align="center">title</h2> 
 
    <div class="form-group"> 
 
     <form name="add_name" id="add_name"> 
 
     <div class="table-responsive"> 
 
      <table class="table table-bordered" id="articles"> 
 
      <tr> 
 

 
       <td><input type="number" id="quantity" name="quantity[]" placeholder="quantity" class="form-control name_list" /></td> 
 
       <td><input type="number" id="price" name="price[]" placeholder="price" class="form-control name_list" /></td> 
 
       <td><input type="number" id="total" name="total[]" placeholder="total" class="form-control name_list" readonly /></td> 
 
       <td><button type="button" name="add" id="add" class="btn btn-success">Add new</button></td> 
 
      </tr> 
 
      </table> 
 
      <input type="button" name="submit" id="submit" class="btn btn-info" value="Submit" /> 
 
     </div> 
 
     </form> 
 
    </div> 
 
    </div> 
 
</body> 
 
</html>

+0

を役に立てば幸い一意であること – baao

+0

データベースに値を挿入すると、このスクリプトはうまく動作します。目的は、合計を手動で挿入するのではなく、自動的に計算してからdbに保存することです。 可能であれば、この例で一意のIDを使用して図を描く方法の例。ありがとう – sigma

答えて

0

が解決策であるが追加されましたが、jQueryの

SECONDは:計算する方法を修正しました。あなたが数量*価格を望むなら、それは合計を作る代わりに掛けるべきです。変更内容を確認してください

THIRD:各IDと追加方法に番号を追加しました。

FOURTH:ID

THIRDを運ぶように変更計算方法:あなたが作成したタイマーをコメントし、入力のJQUERY event "change"内の最終値を計算する方法と呼ばれます。 changeイベントが発生した場合は、この方法で、あなたは(何も変わっていない場合でも)永遠に処理していないとだけ計算it's

はIDが持っている、それは初心者のための

$(document).ready(function() { 
 
    var i = 0; 
 
    $("#quantity-" + i).change(function() { 
 
    upd_art(i) 
 
    }); 
 
    $("#price-" + i).change(function() { 
 
    upd_art(i) 
 
    }); 
 

 

 
    $('#add').click(function() { 
 
    i++; 
 
    $('#articles').append('<tr id="row' + i + '"><td><input type="number" value=0 id="quantity-' + i + '" name="quantity[]" placeholder="quantity" class="form-control name_list" /></td> <td><input type="number" id="price-' + i + '" name="price[]" value=0 placeholder="price" class="form-control name_list" /></td> <td><input type="number" id="total-' + i + '" name="total[]" placeholder="total" class="form-control name_list" readonly /></td> <td><button type="button" name="remove" id="' + i + '" class="btn btn-danger btn_remove">X</button></td></tr>'); 
 

 
    $("#quantity-" + i).change(function() { 
 
     upd_art(i) 
 
    }); 
 
    $("#price-" + i).change(function() { 
 
     upd_art(i) 
 
    }); 
 

 

 
    }); 
 

 

 
    $(document).on('click', '.btn_remove', function() { 
 
    var button_id = $(this).attr("id"); 
 
    $('#row' + button_id + '').remove(); 
 
    }); 
 

 
    $('#submit').click(function() { 
 
    alert($('#add_name').serialize()); //alerts all values   
 
    $.ajax({ 
 
     url: "wwwdb.php", 
 
     method: "POST", 
 
     data: $('#add_name').serialize(), 
 
     success: function(data) { 
 
     $('#add_name')[0].reset(); 
 
     } 
 
    }); 
 
    }); 
 

 
    function upd_art(i) { 
 
    var qty = $('#quantity-' + i).val(); 
 
    var price = $('#price-' + i).val(); 
 
    var totNumber = (qty * price); 
 
    var tot = totNumber.toFixed(2); 
 
    $('#total-' + i).val(tot); 
 
    } 
 

 

 

 
    // setInterval(upd_art, 1000); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<html> 
 

 
<head> 
 
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js"></script> 
 
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" /> 
 
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script> 
 
</head> 
 

 
<body> 
 
    <div class="container"> 
 
    <br /> 
 
    <br /> 
 
    <h2 align="center">title</h2> 
 
    <div class="form-group"> 
 
     <form name="add_name" id="add_name"> 
 
     <div class="table-responsive"> 
 
      <table class="table table-bordered" id="articles"> 
 
      <tr class="rrjeshta"> 
 

 
       <td><input value=0 type="number" id="quantity-0" name="quantity[]" placeholder="quantity" class="form-control name_list" /></td> 
 
       <td><input value=0 type="number" id="price-0" name="price[]" placeholder="price" class="form-control name_list" /></td> 
 

 
       <td><input type="number" id="total-0" name="total[]" placeholder="total" class="form-control name_list" readonly /></td> 
 
       <td><button type="button" name="add" id="add" class="btn btn-success">Add new</button></td> 
 
      </tr> 
 
      </table> 
 
      <input type="button" name="submit" id="submit" class="btn btn-info" value="Submit" /> 
 
     </div> 
 
     </form> 
 
    </div> 
 
    </div> 
 
</body> 
 

 
</html>

+0

歓迎!! ;)。最初の行が秒または3分の1を作成した後に変化しないことを見た。たぶん、さらにチェックする必要がありますが、jqueryでIDを使用する方法のアイデアはこのようになります。 とにかく、これらの細い部分にはangularJsを使用することを強くおすすめします;) –

0

。 1つのHTMLに同じidsが存在し、それらをjqueryで使用すると、idの最初の出現が考慮され、期待どおりに動作しません。

classを使用してください。新しい動的要素を作成すると、idが代わりに使用されます。 jquery関数upd_artでクラスセレクタを使用します。

FIRST:ここ

関連する問題