【问题标题】:How do you select all the checked items and add all of the prices for items checked to get the total?您如何选择所有已检查的项目并将所有已检查项目的价格相加以获得总数?
【发布时间】:2021-07-04 01:25:46
【问题描述】:

如何使用 javascript 来隔离 html 文件中所有选中的项目。
我想看看检查了什么,这告诉我从菜单中选择了哪些项目。
菜单上有所检查项目的价格。
您如何访问在具有价格的 javascript 数组中选中的那些项目。
然后我想总结一下在 html 菜单上选中的所有项目的价格。
差一点就收到码了。 我想使用forEach(),然后将使用它检查的项目隔离为id
我考虑过使用split('Checkbox')。但是,我当时摸不着头脑,你如何让它工作以使 menuItem 数组价格相加并得到总计。 total += menu.price.

var menuItems = 
  [ { itemName: 'salad',        price: 13.95 } 
  , { itemName: 'pancakes',     price:  8.95 } 
  , { itemName: 'omlette',      price:  8.95 } 
  , { itemName: 'croissant',    price:  5.95 } 
  , { itemName: 'muffin',       price:  8.95 } 
  , { itemName: 'cheeseburger', price: 10.95 } 
  , { itemName: 'teriyaki',     price: 12.95 } 
  , { itemName: 'soup',         price: 11.95 } 
  , { itemName: 'coffee',       price:  1.95 } 
  , { itemName: 'tea',          price: 11.95 } 
  , { itemName: 'beer',         price:  5.95 } 
  , { itemName: 'milk',         price:  3.95 } 
  ] 
var total = 0;

document.querySelectorAll("input[type='checkbox']")
  .forEach(checkbox => {
    checkbox.addEventListener('click', function(event) { 
    if (event.target.checked) {
      console.log(event.target.checked);
      console.log('total ' + total);
    }   
  })         
});
<!DOCTYPE html>
<html xmlns:th="http://thymeleaf.org">
<head>
<title>MENU</title>
<script type="text/javascript"></script>
<link rel="stylesheet" type="text/css" href="css/menu.css" >
</head>
<body>

<div class="name">
  <h1>JOE'S FAMILY DINER</h1>
</div>

<table style="width:100%">
  <tr>
    <th>BreakFast</th>
    <th>Lunch</th> 
    <th>Beverages</th>
  </tr>
  <tr>
    <td>
      <label for="Pancakes"> <b>Blueberry Pancakes</b> </label>
      <input type="checkbox" id="panCheckbox" name="pancakes"/>
      $8.95
    </td>
    <td>
      <label for="burger"> <b>Cheeseburger</b> </label>
      <input type="checkbox" id="burg" name="burger"/>
      $10.95
    </td>
    <td>
      <label for="Coffee"> <b>Black Coffee:</b> </label>
      <input type="checkbox" id="cofCheckbox" name="coffee" />
      $1.95
    </td>
  </tr>
  <tr>
    <td>
      <label for="Omelette"><b>Vegetable Omelette</b></label>
      <input type="checkbox" id="omlCheckbox"  name="omlette"/>
      $8.95
    </td>
    <td>
      <label for="Wrap"> <b>Teriyaki Wrap:</b></label>
      <input type="checkbox" id="rapCheckbox" name="wrap" />
      $12.95
    </td>
    <td>
      <label for="Tea"><b>Green Tea:</b></label>
      <input type="checkbox"id="teCheckbox"  name="tea" />
      $11.95
    </td>
  </tr>
  <tr>
    <td>
      <label for="Croissant"> <b>Croissant:</b> </label>
      <input type="checkbox" id="crosCheckbox" name="croissant"/>
      $5.95
    </td>
    <td>
      <label for="salad"> <b>Ceasar Salad:</b> </label>
      <input type="checkbox" id="salCheckbox" name="sald" />
      $13.95
    </td>
    <td>
      <label for="beer"> <b>Corona Beer 12 oz:</b> </label>
      <input type="checkbox" id="BerCheckbox" name="Beer" />
      $5.95
    </td>
  </tr>
  <tr>
    <td> 
      <label for="Muffin"><b>Blueberry Muffin</b> </label>
      <input type="checkbox" id="MufCheckbox"  name="muffin"/>
      $8.95
    </td>
    <td>
      <label for="soup"> <b>Tomato Soup:</b> </label>
      <input type="checkbox" id="souCheckbox" name="soup" />
      $11.95
    </td>
    <td>
      <label for="Milk"> <b>Chocolate Milk:</b> </label>
      <input type="checkbox" id="milCheckbox" name="milk" />
      $3.95
    </td>
  </tr>
</table>
<div>
  <form>
    <input type="submit" value="Submit" id="sub">
    <input type="reset" value="Reset">
  </form>
</div>  
<div style="margin-top: 10px;">
  <button type="button">Total Amount</button>
</div>
        
<script type="text/javascript" src="/js/menu.js"></script>
</body>
</html>

【问题讨论】:

标签: javascript arrays split sum numbers


【解决方案1】:

通过在带有数据属性的复选框上指定价格来实现类似的效果。不过要注意浮点错误。

document.getElementById("SubmitButton").addEventListener('click', function(e) {
  e.preventDefault();
  var selectedItems = document.querySelectorAll('.item-selection:checked');
  
  var selectedItemPrices = [];
  var total = 0;
  
  for (var i = 0; i < selectedItems.length; i++) {
    var price = Number.parseFloat(selectedItems[i].getAttribute('data-price'));
  
    selectedItemPrices.push({
      itemName: selectedItems[i].getAttribute('name'),
      price: price.toFixed(2)
    });
    
    total += price;
  }
  
  console.log(selectedItemPrices);
  console.log(total.toFixed(2));
});
<table style="width:100%">
  <tr>
    <th>BreakFast</th>
    <th>Lunch</th>
    <th>Beverages</th>
  </tr>
  <tr>
    <td><label for="Pancakes"><b>Blueberry Pancakes</b></label>
      <input class="item-selection" type="checkbox" id="panCheckbox" name="pancakes" data-price="8.95" />$8.95</td>
    <td><label for="burger"><b>Cheeseburger</b></label>
      <input class="item-selection" type="checkbox" id="burg" name="burger" data-price="10.95"/>$10.95</td>
    <td><label for="Coffee"><b>Black Coffee:</b></label>
      <input class="item-selection" type="checkbox" id="cofCheckbox" name="coffee" data-price="1.95"/>$1.95</td>
  </tr>
  <tr>
    <td><label for="Omelette"><b>Vegetable Omelette</b></label>
      <input class="item-selection" type="checkbox" id="omlCheckbox" name="omlette" data-price="8.95"/>$8.95</td>
    <td><label for="Wrap"><b>Teriyaki Wrap:</b></label>
      <input class="item-selection" type="checkbox" id="rapCheckbox" name="wrap" data-price="12.95"/>$12.95</td>
    <td><label for="Tea"><b>Green Tea:</b></label>
      <input class="item-selection" type="checkbox" id="teCheckbox" name="tea" data-price="11.95"/>$11.95</td>
  </tr>
  <tr>
    <td> <label for="Croissant"><b>Croissant:</b></label>
      <input class="item-selection" type="checkbox" id="crosCheckbox" name="croissant" data-price="5.95"/>$5.95</td>
    <td><label for="salad"><b>Ceasar Salad:</b></label>
      <input class="item-selection" type="checkbox" id="salCheckbox" name="sald" data-price="13.95"/>$13.95</td>
    <td><label for="beer"><b>Corona Beer 12 oz:</b></label>
      <input class="item-selection" type="checkbox" id="BerCheckbox" name="Beer" data-price="5.95"/>$5.95</td>
  </tr>
  <tr>
    <td> <label for="Muffin"><b>Blueberry Muffin</b></label>
      <input class="item-selection" type="checkbox" id="MufCheckbox" name="muffin" data-price="8.95"/>$8.95</td>
    <td><label for="soup"><b>Tomato Soup:</b></label>
      <input class="item-selection" type="checkbox" id="souCheckbox" name="soup" data-price="11.95"/>$11.95</td>
    <td><label for="Milk"><b>Chocolate Milk:</b></label>
      <input class="item-selection" type="checkbox" id="milCheckbox" name="milk" data-price="3.95"/>$3.95</td>
  </tr>
</table>
<div>
  <form>
    <input id="SubmitButton" type="submit" value="Submit" id="sub">
    <input type="reset" value="Reset">
  </form>
</div>
<div style="margin-top: 10px;">
  <button type="button">Total Amount</button>
</div>

【讨论】:

    【解决方案2】:

    试试这个。此解决方案将选中/取消选中复选框。我在任何按钮单击时都需要这个,让我知道我会修改。

    我也修改了您的 HTML。您可以使用复选框的值属性并在那里分配项目值。在 JavaScript 中,它可用于进一步计算。如果有任何问题,请告诉我。

    <!DOCTYPE html>
    <html xmlns:th="http://thymeleaf.org">
    <head>
        <title>MENU</title>
        <script type="text/javascript" src="/js/menu.js"></script>
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
        <script type="text/javascript">
    
            var total = 0;
            $(document).ready(function () {
                $('input[type="checkbox"]').change(function () {
                    var ischecked = $(this).is(':checked');
                    if (!ischecked) {
                        total -= parseFloat($(this).val());
                    } else {
                        total += parseFloat($(this).val());
                    }
                    console.log(total.toFixed(2));
                });
            });
    
        </script>
        <link rel="stylesheet" type="text/css" href="css/menu.css">
    </head>
    <body>
        <form>
            <div class="name">
                <h1>JOE'S FAMILY DINER</h1>
            </div>
    
            <table style="width:100%">
                <tr>
                    <th>BreakFast</th>
                    <th>Lunch</th>
                    <th>Beverages</th>
                </tr>
                <tr>
                    <td>
                        <label for="Pancakes"> <b>Blueberry Pancakes</b> </label>
                        <input type="checkbox" id="panCheckbox" name="pancakes" value="8.95" />$8.95
    
                    </td>
                    <td>
                        <label for="burger"> <b>Cheeseburger</b> </label>
                        <input type="checkbox" id="burg" name="burger" value="10.95" />
                        $10.95
                    </td>
                    <td>
                        <label for="Coffee"> <b>Black Coffee:</b> </label>
                        <input type="checkbox" id="cofCheckbox" name="coffee" value="1.95" />
                        $1.95
                    </td>
                </tr>
                <tr>
                    <td>
                        <label for="Omelette"><b>Vegetable Omelette</b></label>
                        <input type="checkbox" id="omlCheckbox" name="omlette" value="8.95" />
                        $8.95
                    </td>
                    <td>
                        <label for="Wrap"> <b>Teriyaki Wrap:</b></label>
                        <input type="checkbox" id="rapCheckbox" name="wrap" value="12.95" />
                        $12.95
                    </td>
                    <td>
                        <label for="Tea"><b>Green Tea:</b></label>
                        <input type="checkbox" id="teCheckbox" name="tea" value="11.95" />
                        $11.95
                    </td>
                </tr>
                <tr>
                    <td>
                        <label for="Croissant"> <b>Croissant:</b> </label>
                        <input type="checkbox" id="crosCheckbox" name="croissant" value="5.95" />
                        $5.95
                    </td>
                    <td>
                        <label for="salad"> <b>Ceasar Salad:</b> </label>
                        <input type="checkbox" id="salCheckbox" name="sald" value="13.95" />
                        $13.95
                    </td>
                    <td>
                        <label for="beer"> <b>Corona Beer 12 oz:</b> </label>
                        <input type="checkbox" id="BerCheckbox" name="Beer" value="5.95" />
                        $5.95
                    </td>
                </tr>
                <tr>
                    <td>
                        <label for="Muffin"><b>Blueberry Muffin</b> </label>
                        <input type="checkbox" id="MufCheckbox" name="muffin" value="8.95" />
                        $8.95
                    </td>
                    <td>
                        <label for="soup"> <b>Tomato Soup:</b> </label>
                        <input type="checkbox" id="souCheckbox" name="soup" value="11.95" />
                        $11.95
                    </td>
                    <td>
                        <label for="Milk"> <b>Chocolate Milk:</b> </label>
                        <input type="checkbox" id="milCheckbox" name="milk" value="3.95" />
                        $3.95
                    </td>
                </tr>
            </table>
            <div>
                <input type="submit" value="Submit" id="sub">
                <input type="reset" value="Reset">
            </div>
            <div style="margin-top: 10px;">
                <button type="button">Total Amount</button>
            </div>
        </form>
    </body>
    </html>
    

    【讨论】:

      【解决方案3】:

      最简单的方法是使用FormData它只获取表单中选中的元素。

      这也意味着您的 html 必须为这项工作重新排列

      因为这里提出的答案暂时被完全忽视了如何使用表格 这是我认为可以接受的答案

      const menuItems = 
        { BreakFast :
          [ { itemName: 'pancakes',  price: 8.95, label: 'Blueberry Pancakes' }
          , { itemName: 'omlette',   price: 8.95, label: 'Vegetable Omelette' }
          , { itemName: 'croissant', price: 5.95, label: 'Croissant'          }
          , { itemName: 'muffin',    price: 8.95, label: 'Blueberry Muffin'   }
          ]
        , Lunch :
          [ { itemName: 'cheeseburger', price: 10.95, label: 'Cheeseburger'  }
          , { itemName: 'teriyaki',     price: 12.95, label: 'Teriyaki Wrap' }
          , { itemName: 'salad',        price: 13.95, label: 'Ceasar Salad'  }
          , { itemName: 'soup',         price: 11.95, label: 'Tomato Soup'   }
          ]
        , Beverages :
          [ { itemName: 'coffee', price:  1.95, label: 'Black Coffee'      }
          , { itemName: 'tea',    price: 11.95, label: 'Green Tea'         }
          , { itemName: 'beer',   price:  5.95, label: 'Corona Beer 12 oz' }
          , { itemName: 'milk',   price:  3.95, label: 'Chocolate Milk'    }
          ]
        }
      
      const
        myForm = document.querySelector('#my-form-id')
      , total  = document.querySelector('#total > em')
      
      for (let menu in menuItems) // build the menu
        {
        let menuPart = document.createElement('fieldset') 
        menuPart.innerHTML = `<legend>${menu}</legend>`
        menuItems[menu].forEach(item=>
          {
          menuPart.innerHTML += `
              <label>
                <b>${item.label}</b>
                <input type="checkbox" name="${item.itemName}" value="${item.price}">
                <em>$ ${item.price}</em>
              </label>`
          })
        myForm.querySelector('.cols-3-parts').appendChild(menuPart)
        }
      myForm.onsubmit = e =>
        {
        e.preventDefault() // disable submit while testing
      
        let inputJSON = Array.from(new FormData(myForm))
          .reduce((r,[name,value])=>{ r[name]= isNaN(value) ? value : Number(value); return r} ,{}) 
        console.log( JSON.stringify( inputJSON ))
        setTimeout(console.clear, 2000);
        }
      myForm.onreset = e =>
        {
        total.textContent = '0.00'
        }
      myForm.oninput = e =>
        {
        let  totalVal = 0;
        Array.from(new FormData(myForm))
          .forEach(([name,value])=> totalVal += isNaN(value) ? 0 : Number(value) ) 
          
        total.textContent = totalVal.toFixed(2)
        }
      form#my-form-id {
        width   : 60em;
        padding : .4em;
        }
      button {
        margin : 1em .4em 0 0;
        width  : 6em;
        }
      .cols-3-parts {
        display   : flex;
        flex-wrap : wrap;
        }
      .cols-3-parts fieldset {
        flex-grow : 1;
        width     : 30%;
        }
      .cols-3-parts fieldset label {
        display : block;
        float   : left;
        clear   : left; 
        }
      .cols-3-parts fieldset label b {
        display       : inline-block;
        width         : 11.4em;
        text-overflow : "";
        white-space   : nowrap;
        overflow      : hidden;
        }
      .cols-3-parts fieldset label b::after {
        content     : '...............................';
        color       : grey;
        font-weight : normal;
        }
      .cols-3-parts fieldset label input[type="checkbox"] {
        vertical-align: top;
        }
      .cols-3-parts fieldset label em {
        font-size      : .8em;
        vertical-align : top;
        }
      <h1>JOE'S FAMILY DINER</h1>
      
      <form action="xx" id="my-form-id">
        <div class='cols-3-parts'> </div>
      
        <button type="submit">Submit</button>
        <button type="reset" >Reset</button>
      </form>
      
      <p id="total">
        Total : $ <em>0.00</em>
      </p>

      【讨论】:

        猜你喜欢
        • 2019-01-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多