JQuery, как не добавлять число при каждом изменении

У меня есть бланк заказа. Если пользователь изменит пакеты, цена изменится.

HTML

<select name = "item" id = "item">
  <option value = "i1">Item1</option>
  <option value = "i2">Item2<option>
</select>
<select name = "detail" id = "detail">
  <option value = "d1">Detail1</option>
  <option value = "d2">Detail2</option>
</select>
<p>Price : <span id = "price"></span></p>

Приведенный ниже PHP отправит данные, полученные из формы

PHP

$item=$_POST["item"];
$detail=$_POST["detail"];
$price=0;
if ($item= = "p1"){
  $price=$price+10;
}
else{
  $price=$price+5;
}
if ($detail= = "d1"){
  $price=$price+2;
}
else{
  $price=$price+1;
}
// codes for sending the data to database

jQuery ниже покажет цену выбранного пакета. Я хочу, чтобы цена отображалась каждый раз, когда она меняется

jQuery

var item=$("#item").val();
var detail=$("#detail").val();
var price=0;
$("#item").on('change',function(){
  if (item= = "i1"){
    price=price+10; 
    $("#price").html("$ "+price);}
  else{
    price=price+5;
    $("#price").html("$ "+price);}
})
$("#detail").on('change',function(){
  if (detail= = "d1"){
    price=price+2;
    $("#price").html("$ "+price);}
  else {
    price=price+1;
    $("#price").html("$ "+price);}
})

Хочу: price=price(item)+price(detail). Проблема в том, что если пользователь изменит его более одного раза, он добавит номер, хотя PHP не будет отправлять номер из jQuery.

Скажем, пользователь выбирает Item1 и Detail2. Цена показывает 11. Но если пользователь изменит его на Detail1, будет показано 13 и т. д., И, наконец, пользователь выберет Item2 и Detail1. PHP отправит 7, но jQuery покажет больше 7. Есть идеи?

Переместите var item=$("#item").val(); var detail=$("#detail").val(); var price=0; внутрь функции при изменении

JYoThI 09.11.2018 06:03
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
1
55
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Самое простое решение - иметь одну функцию, которая вычисляет общую сумму при изменении любого из значений, что означает, что она будет каждый раз пересчитывать общую цену вместо того, чтобы две функции влияли на одно и то же значение. вот мое решение ниже:

// Storage for the item prices
var itemDict = {
    "p1": 10,
    "p2": 4,
    "p3": 0
};

// Storage for the detail prices
var detailDict = {
    "d1": 2,
    "d2": 5,
    "d3": 2
};

$("#item").on('change', function () {
    CalcPrice();
})

$("#detail").on('change', function () {
    CalcPrice();
})

function CalcPrice() {
    var price = 0;

    const itemPrice = itemDict[$("#item").val()] || 2; // 2 as a default
    const detailPrice = detailDict[$("#detail").val()] || 1; // 1 as a default

    $("#price").html("$ " + price);
}
Ответ принят как подходящий

Привет :) Вместо этого можно использовать этот код:

Для вас HTML:

<select name = "item" id = "item">
  <option value = "0" disabled selected>Select your option</option>
  <option value = "10">Item1</option>
  <option value = "5">Item2<option>
</select>
<select name = "detail" id = "detail">
  <option value = "0" disabled selected>Select your option</option>
  <option value = "2">Detail1</option>
  <option value = "1">Detail2</option>
</select>
<p>Price : <span id = "price"></span></p>

и для вашего JQuery:

$(document).ready(function () {
   $("#item,#detail").on('change',function() {
      var item=$("#item").val() || 0;
      var detail=$("#detail").val() || 0;
      var price = 0;
      price = parseInt(item) + parseInt(detail);
      $("#price").html("$ "+price);
   });
});

Проблема в этих строках:

var item=$("#item").val();
var detail=$("#detail").val();
var price=0;

Вы объявляете и устанавливаете значения глобально. И он будет установлен только один раз при загрузке страницы. Итак, когда вы обращаетесь к этим переменным в событии change для #item и #detail, вы получаете доступ к значениям из этих глобальных переменных, выполняете математические вычисления и сохраняете их обратно! Итак, при следующем запуске любого из этих событий change (то есть, если пользователь изменяет элемент или деталь из раскрывающихся списков), вы снова получаете доступ к значениям из глобальных переменных, которые содержат данные из предыдущего расчета! Вот почему вы принимали неправильные значения.

Итак, решение состоит в том, чтобы переместить эти три переменные внутрь каждого из этих событий change. (что предложил @JYoThi), например:

$("#item").on('change',function(){
  var item=$("#item").val();
  var detail=$("#detail").val();
  var price=0;

  if (item= = "i1"){
    price=price+10; 
    $("#price").html("$ "+price);}
  else{
    price=price+5;
    $("#price").html("$ "+price);}
});

$("#detail").on('change',function(){
  var item=$("#item").val();
  var detail=$("#detail").val();
  var price=0;

  if (detail= = "d1"){
    price=price+2;
    $("#price").html("$ "+price);}
  else {
    price=price+1;
    $("#price").html("$ "+price);}
});

Это, вероятно, решит вашу проблему на данный момент!

@Vinia и @Cornelis также предоставили несколько хороших решений, надеюсь, вы сможете понять это, посмотрев на них.

Ваше здоровье!

Другие вопросы по теме