RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1160766
Accepted
Сергей Комыза
Сергей Комыза
Asked:2020-08-01 03:23:41 +0000 UTC2020-08-01 03:23:41 +0000 UTC 2020-08-01 03:23:41 +0000 UTC

javascript 上价格计算器的错误工作

  • 772

请帮忙。我为选定的产品制作了这个价格计算器。原则是 - 您选择产品的型号及其数量。您按下按钮 - 添加 - 并在下面自动创建该数量的位置。您可以创建任意数量的职位。总金额会相应变化。您还可以删除任何头寸,总金额减少,删除产品的价格。问题是,当您删除最近的位置时,一切正常。但是,如果您从中间或第一个头寸中删除一个头寸,则该头寸的价格将重复多次,因为在被删除的头寸下方有更多头寸。因此,从总金额中减去不正确。在我看来,问题出在数组(或者,正确的,导航,伪数组)中,我在其中使用了删除按钮。但究竟是什么,我无法理解。我正在迭代。通过 forEach 根本不起作用。

let mainPrice = document.querySelector('.price__input'); // итоговая цена
let create = document.querySelector('.wrap-item'); // общий блок с элементами
let chooseModel = create.querySelector('.model'); // поле выбора модели
let chooseQuantity = create.querySelector('.values'); // поле выбора кол-ва 
let more = document.querySelector('.more-item'); // кнопка добавить позицию
let boxItems = document.querySelector('.box'); // блок, куда генерятся созданные позиции

more.addEventListener('click', function(){
  
  let selectVal = chooseModel.selectedIndex; // индекс выбранного option
  let allOptions = chooseModel.options; // все option в select
  let currOption = allOptions[selectVal]; // конкретная выбранная позиция
  let chooseModelPrice = currOption.getAttribute('data-price'); // сумма, которая стоит data-price
  let chooseModelValue = chooseModel.value; // выбранная модель
  
  // итоговая цена = итоговая цена + сумма, которая стоит в data-price * кол-во выбранной модели
  mainPrice.value = +mainPrice.value + chooseModelPrice * chooseQuantity.value;
  
  // создаем блок с полями (модель и кол-во)
  let item = document.createElement('div');
  item.classList.add('item');
  
  // создаем поле с выбранной моделью
  let addModel = document.createElement('input');
  addModel.classList.add('add-model');
  addModel.value = chooseModelValue;
  
  // создаем поле с выбранным кол-вом
  let addValues = document.createElement('input');
  addValues.classList.add('add-values');
  addValues.value = chooseQuantity.value;
  
  // создаем поле с суммой за конкретное кол-во выбранной модели
  let price = document.createElement('span');
  price.classList.add('curr-price');
  price.innerHTML = chooseModelPrice * chooseQuantity.value;
  
  // создаем кнопку, при клике на кот. будет удаляться соответствующий блок с полями
  let deleteItem = document.createElement('span');
  deleteItem.classList.add('delete-item');
  
  // добавляем все созданные элементы
  boxItems.appendChild(item);
  item.append(addModel, addValues, price, deleteItem);
  
  // сбрасываем значения полей выбора
  chooseModel.value = "Выберите модель";
  chooseQuantity.value = 1;
  
  deleteFunc();
});

// удаление позиций
let deleteBtns = document.getElementsByClassName('delete-item');
function deleteFunc(){
  for(let elem of deleteBtns){
    let currPrice = elem.parentElement.querySelector('.curr-price').innerHTML;
    elem.addEventListener('click', function(event){
      console.log(elem.parentElement);
      elem.parentElement.remove();
      mainPrice.value = mainPrice.value - currPrice;
    });
  }
}
.form {
  width: 580px;
}
.form__item {
  width: 30%;
  margin: 0 0 30px 0;
}
.form__item label {
  display: block;
}
.form__submit {
  display: flex;
  align-items: center;
  justify-content: space-between;
  width: 100%;
}

.wrap-item {
  display: flex;
  flex-wrap: wrap;
  justify-content: space-between;
  align-items: center;
  width: 100%;
}

.more-item {
  cursor: pointer;
}

.delete-item {
  position: relative;
  display: inline-block;
  width: 30px;
  height: 30px;
  border: 1px solid;
  cursor: pointer;
}
.delete-item::after {
  content: "-";
  position: absolute;
  top: 50%;
  left: 50%;
}
<form id="form" class="form" action="">

  <div class="wrap-item">
      <div class="form__item">
        <label for="">Модель</label>
        <select class="model" name="">
          <option>Выберите модель</option>
          <option value="Модель 1" data-price="100">Модель 1</option>
          <option value="Модель 2" data-price="200">Модель 2</option>
          <option value="Модель 3" data-price="300">Модель 3</option>
        </select>
      </div>
      <div class="form__item">
        <label for="">Количество</label>
        <input type="number" class="form__input values" value="1" min="1">
      </div>
      <div class="form__item">
         <div class="more-item">Добавить позицию</div>
      </div>
 </div>
  <div class="box">

  </div>
<!--  ==========================  -->

<!--  ==========================  -->
  <div class="form__submit">
    <div class="form__price price">
      Итого:
      <input type="text" class="price__input" value="0">
      руб.
    </div>
  </div>
</form>

javascript
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    Aziz Umarov
    2020-08-01T03:48:33Z2020-08-01T03:48:33Z

    js代码没怎么改,希望对你有帮助。现在按您的要求工作。出于某种原因,在添加新位置时,eventListener 在循环中被迭代。我通过传递必要的参数来改变它。

    let mainPrice = document.querySelector('.price__input'); // итоговая цена
    let create = document.querySelector('.wrap-item'); // общий блок с элементами
    let chooseModel = create.querySelector('.model'); // поле выбора модели
    let chooseQuantity = create.querySelector('.values'); // поле выбора кол-ва 
    let more = document.querySelector('.more-item'); // кнопка добавить позицию
    let boxItems = document.querySelector('.box'); // блок, куда генерятся созданные позиции
    
    more.addEventListener('click', function(){
      
      let selectVal = chooseModel.selectedIndex; // индекс выбранного option
      let allOptions = chooseModel.options; // все option в select
      let currOption = allOptions[selectVal]; // конкретная выбранная позиция
      let chooseModelPrice = currOption.getAttribute('data-price'); // сумма, которая стоит data-price
      let chooseModelValue = chooseModel.value; // выбранная модель
      
      // итоговая цена = итоговая цена + сумма, которая стоит в data-price * кол-во выбранной модели
      mainPrice.value = +mainPrice.value + chooseModelPrice * chooseQuantity.value;
      
      // создаем блок с полями (модель и кол-во)
      let item = document.createElement('div');
      item.classList.add('item');
      
      // создаем поле с выбранной моделью
      let addModel = document.createElement('input');
      addModel.classList.add('add-model');
      addModel.value = chooseModelValue;
      
      // создаем поле с выбранным кол-вом
      let addValues = document.createElement('input');
      addValues.classList.add('add-values');
      addValues.value = chooseQuantity.value;
      
      // создаем поле с суммой за конкретное кол-во выбранной модели
      let price = document.createElement('span');
      price.classList.add('curr-price');
      price.innerHTML = chooseModelPrice * chooseQuantity.value;
      
      // создаем кнопку, при клике на кот. будет удаляться соответствующий блок с полями
      let deleteItem = document.createElement('span');
      deleteItem.classList.add('delete-item');
      
      // добавляем все созданные элементы
      boxItems.appendChild(item);
      item.append(addModel, addValues, price, deleteItem);
      
      // сбрасываем значения полей выбора
      chooseModel.value = "Выберите модель";
      chooseQuantity.value = 1;
      
      deleteFunc(boxItems, item, deleteItem);
    });
    
    // удаление позиций
    let deleteBtns = document.getElementsByClassName('delete-item');
    function deleteFunc(parentElement, item, deleteItem){
        let currPrice = item.querySelector('.curr-price').innerHTML;
        deleteItem.addEventListener('click', function(event){
          console.log(item.parentElement);
          parentElement.removeChild(item);
          mainPrice.value = mainPrice.value - currPrice;
        });      
    }
    .form {
      width: 580px;
    }
    .form__item {
      width: 30%;
      margin: 0 0 30px 0;
    }
    .form__item label {
      display: block;
    }
    .form__submit {
      display: flex;
      align-items: center;
      justify-content: space-between;
      width: 100%;
    }
    
    .wrap-item {
      display: flex;
      flex-wrap: wrap;
      justify-content: space-between;
      align-items: center;
      width: 100%;
    }
    
    .more-item {
      cursor: pointer;
    }
    
    .delete-item {
      position: relative;
      display: inline-block;
      width: 30px;
      height: 30px;
      border: 1px solid;
      cursor: pointer;
    }
    .delete-item::after {
      content: "-";
      position: absolute;
      top: 50%;
      left: 50%;
    }
    <form id="form" class="form" action="">
    
      <div class="wrap-item">
          <div class="form__item">
            <label for="">Модель</label>
            <select class="model" name="">
              <option>Выберите модель</option>
              <option value="Модель 1" data-price="100">Модель 1</option>
              <option value="Модель 2" data-price="200">Модель 2</option>
              <option value="Модель 3" data-price="300">Модель 3</option>
            </select>
          </div>
          <div class="form__item">
            <label for="">Количество</label>
            <input type="number" class="form__input values" value="1" min="1">
          </div>
          <div class="form__item">
             <div class="more-item">Добавить позицию</div>
          </div>
     </div>
      <div class="box">
    
      </div>
    <!--  ==========================  -->
    
    <!--  ==========================  -->
      <div class="form__submit">
        <div class="form__price price">
          Итого:
          <input type="text" class="price__input" value="0">
          руб.
        </div>
      </div>
    </form>

    • 3

相关问题

  • 第二个 Instagram 按钮的 CSS 属性

  • 由于模糊,内容不可见

  • 弹出队列。消息显示不正确

  • 是否可以在 for 循环中插入提示?

  • 如何将 JSON 请求中的信息输出到数据表 Vuetify vue.js?

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何从列表中打印最大元素(str 类型)的长度?

    • 2 个回答
  • Marko Smith

    如何在 PyQT5 中清除 QFrame 的内容

    • 1 个回答
  • Marko Smith

    如何将具有特定字符的字符串拆分为两个不同的列表?

    • 2 个回答
  • Marko Smith

    导航栏活动元素

    • 1 个回答
  • Marko Smith

    是否可以将文本放入数组中?[关闭]

    • 1 个回答
  • Marko Smith

    如何一次用多个分隔符拆分字符串?

    • 1 个回答
  • Marko Smith

    如何通过 ClassPath 创建 InputStream?

    • 2 个回答
  • Marko Smith

    在一个查询中连接多个表

    • 1 个回答
  • Marko Smith

    对列表列表中的所有值求和

    • 3 个回答
  • Marko Smith

    如何对齐 string.Format 中的列?

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5