根据 selection from multi select 下拉列表的价格数据总和

sum of price-data according to the selection from multi select dropdown

根据选择,我希望在 totalamount 输入框中显示总数据价格

 <HTML>
   <body>
<form name="myForm" action="insert.php" onsubmit="return validateForm()" method="post" id="myForm" style="width=90%" enctype="multipart/form-data" required>
<label>Test Name:</label>
     <select id="framework" name="framework[]" multiple class="form-control" >
<option value="HDL Cholesterol" data-price="180">HDL Cholesterol</option>
<option value="Total Cholesterol" data-price=180180180>Total Cholesterol</option>
<option value="Triglycerides (TG)" data-price=180285180>Triglycerides (TG)</option>
<option value="Sugar (Glucose) Fasting (FBS)" data-price=28570285>Sugar (Glucose) Fasting (FBS)</option>
<option value="Sugar (Glucose) Post Prandial (PPBS)" data-price=707070>Sugar (Glucose) Post Prandial (PPBS)</option>
<option value="Sugar (Glucose) Random (RBS)" data-price=707070>Sugar (Glucose) Random (RBS)</option>
<option value="Reticulocyte Count" data-price=7055070>Reticulocyte Count</option>
<option value="Total Thyroxine (T4)" data-price=550198550>Total Thyroxine (T4)</option>
<option value="Total Triiodothyronine (T3)" data-price=198198198>Total Triiodothyronine (T3)</option>
<option value="TSH (Thyroid Stimulating Hormone)" data-price=198240198>TSH (Thyroid Stimulating Hormone)</option>
<option value="Alkaline Phosphatase (ALP)" data-price=240210240>Alkaline Phosphatase (ALP)</option>
<option value="Aspartate Aminotransferase (SGOT )" data-price=210190210>Aspartate Aminotransferase (SGOT )</option>
<option value="Bilirubin Total" data-price=190130190>Bilirubin Total</option>
<option value="Calcium" data-price=130176130>Calcium</option>
<option value="Iron" data-price=176380176>Iron</option>
</select>
<td><label>Total Amount:</label><input type="number" name="totalamount">
</body>
</html>

两种口味的解决方案。当然,reduce 可以用于任何一种方法,但在 jQuery 方式中,我尝试坚持使用 jQuery 方法。

VanillaJS

您可以使用 array.reduce() 函数来计算它,因为它正在使用 change 事件侦听器进行更改。将变量保留为全局变量,以便您可以在其他地方引用它(例如 form.submit)。

这一行,解释:

totalVal = [...e.target.querySelectorAll('option:checked')] // get the HTML collection of selected option elements and convert that into an iterable array using the  [...] spread syntax
            .reduce((b, a) => // b is the accumulating value, a is the current iterating element
                (b + +a.dataset.price) // convert the price data-attribute to a number using the shorthand +
             , 0); // b starts out as zero and we add to it

let totalVal = 0;
window.addEventListener('load', () => {
  document.querySelector('#framework').addEventListener('change', e => {
    totalVal = [...e.target.querySelectorAll('option:checked')].reduce((b, a) => (b + +a.dataset.price), 0);
    document.querySelector('[name=totalamount]').value = totalVal
  })
})
<form name="myForm" action="insert.php" onsubmit="return validateForm()" method="post" id="myForm" style="width=90%" enctype="multipart/form-data" required>
  <label>Test Name:</label>
  <select id="framework" name="framework[]" multiple class="form-control">
    <option value="HDL Cholesterol" data-id="1" data-price="180">HDL Cholesterol</option>
    <option value="Total Cholesterol" data-id="2" data-price="180180180">Total Cholesterol</option>
    <option value="Triglycerides (TG)" data-id="3" data-price="180285180">Triglycerides (TG)</option>
    <option value="Sugar (Glucose) Fasting (FBS)" data-id="4" data-price="28570285">Sugar (Glucose) Fasting (FBS)</option>
    <option value="Sugar (Glucose) Post Prandial (PPBS)" data-id="5" data-price="707070">Sugar (Glucose) Post Prandial (PPBS)</option>
    <option value="Sugar (Glucose) Random (RBS)" data-id="6" data-price="707070">Sugar (Glucose) Random (RBS)</option>
    <option value="Reticulocyte Count" data-id="7" data-price="7055070">Reticulocyte Count</option>
    <option value="Total Thyroxine (T4)" data-id="8" data-price="550198550">Total Thyroxine (T4)</option>
    <option value="Total Triiodothyronine (T3)" data-id="9" data-price="198198198">Total Triiodothyronine (T3)</option>
    <option value="TSH (Thyroid Stimulating Hormone)" data-id="10" data-price="198240198">TSH (Thyroid Stimulating Hormone)</option>
    <option value="Alkaline Phosphatase (ALP)" data-id="11" data-price="240210240">Alkaline Phosphatase (ALP)</option>
    <option value="Aspartate Aminotransferase (SGOT )" data-id="12" data-price="210190210">Aspartate Aminotransferase (SGOT )</option>
    <option value="Bilirubin Total" data-id="13" data-price="190130190">Bilirubin Total</option>
    <option value="Calcium" data-id="14" data-price="130176130">Calcium</option>
    <option value="Iron" data-id="15" data-price="176380176">Iron</option>
  </select>
  <hr>
  <label>Total Amount:</label><input type="number" name="totalamount">
</form>

jQuery方式

let total = 0;
let code = [];
$('#framework').on('change', function() {
  total = 0;
  code = [];
  $(this).find('option:selected').each(function() {
    total += +$(this).data('price');
    code.push($(this).data('id'));
  })
  $('#totalamount').val(total);
  $('#testcode').val(code.join(", "));
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<form name="myForm" action="insert.php" onsubmit="return validateForm()" method="post" id="myForm" style="width=90%" enctype="multipart/form-data" required>
  <label>Test Name:</label>
  <select id="framework" name="framework[]" multiple class="form-control">
    <option value="HDL Cholesterol" data-id="1" data-price="180">HDL Cholesterol</option>
    <option value="Total Cholesterol" data-id="2" data-price="180180180">Total Cholesterol</option>
    <option value="Triglycerides (TG)" data-id="3" data-price="180285180">Triglycerides (TG)</option>
    <option value="Sugar (Glucose) Fasting (FBS)" data-id="4" data-price="28570285">Sugar (Glucose) Fasting (FBS)</option>
    <option value="Sugar (Glucose) Post Prandial (PPBS)" data-id="5" data-price="707070">Sugar (Glucose) Post Prandial (PPBS)</option>
    <option value="Sugar (Glucose) Random (RBS)" data-id="6" data-price="707070">Sugar (Glucose) Random (RBS)</option>
    <option value="Reticulocyte Count" data-id="7" data-price="7055070">Reticulocyte Count</option>
    <option value="Total Thyroxine (T4)" data-id="8" data-price="550198550">Total Thyroxine (T4)</option>
    <option value="Total Triiodothyronine (T3)" data-id="9" data-price="198198198">Total Triiodothyronine (T3)</option>
    <option value="TSH (Thyroid Stimulating Hormone)" data-id="10" data-price="198240198">TSH (Thyroid Stimulating Hormone)</option>
    <option value="Alkaline Phosphatase (ALP)" data-id="11" data-price="240210240">Alkaline Phosphatase (ALP)</option>
    <option value="Aspartate Aminotransferase (SGOT )" data-id="12" data-price="210190210">Aspartate Aminotransferase (SGOT )</option>
    <option value="Bilirubin Total" data-id="13" data-price="190130190">Bilirubin Total</option>
    <option value="Calcium" data-id="14" data-price="130176130">Calcium</option>
    <option value="Iron" data-id="15" data-price="176380176">Iron</option>
  </select>
  <hr>
  <label>Test Code:</label><input type="text" id="testcode" name="testcode">

  <label>Total Amount:</label><input type="number" id="totalamount" name="totalamount">

</form>

我正在使用下面的功能,请问他好吗

on deselecting dropdown option, value remains with no changes
function is to get comma separated testcode to testcode inputbox and totalamount to totalamoun text box 
        <html>`enter code here`
    <body>
          // query to fetch data from database
        $data="";
        $query = "SELECT testcode,testname,mrp FROM pricelist";
        $resultSet = mysqli_query($conn, $query);
        if ($resultSet)
        {
          while($row = mysqli_fetch_array($resultSet)) {
            $data .="<option value='".$row['testname']."' data-price='".$row['mrp']."' data-id='".$row['testcode']."'>".$row['testname']."</option>";
          }
        }
        //form 
        <div class="form-group1">
        <label>Test Name:</label>
             <select id="framework" name="framework[]" multiple class="form-control" >
                  <?php echo $data; ?>
             </select>
            </div>
          </td>    
          <td><label>Test Code:</label><input type="text" id="testcode" name="testcode"></td>    
        <tr class="line_items">    
          <td><label>Total Amount:</label><input type="number" id="totalamount" name="totalamount">
        //jquery function
        <script>
        var total=0;
        var code="";
        $('#framework').on('change', function(){
          var mPrice = $(this).find('option:selected').data('price');
          var mCode = $(this).find('option:selected:last').data('id');
          if (mPrice != null){
            total+=mPrice;
            code +=mCode+',';
            $('#totalamount').val(total);
            $('#testcode').val(code);
          } else {
            
          }
        });
    </body>
        </html>