Вы отображаете вновь рассчитанную цену для всех классов с именем item-price
, поэтому она везде обновляет цену, используйте $(this).nextAll('span')
, чтобы выбрать ближайший span
, и используйте $(this).children(':selected').data('price')
, чтобы получить data-price
извыбранный параметр this
относится к текущему элементу .calculate
:
var basePrice = 12.99;
$(".calculate").change(function() {
newPrice = basePrice;
newPrice += $(this).children(':selected').data('price');
$(this).nextAll('span').html(newPrice.toFixed(2));
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<form name="product_form" method="post" action="/product" class="product">
<span>Apples</span>
<select class="form-control calculate" id="product" name="product">
<option data-price="1" value="1">1</option>
<option data-price="2" value="2">2</option>
<option data-price="3" value="3">3</option>
<option data-price="4" value="4">4</option>
</select>
<br />
<span class="item-price">12.99</span>
</form>
<form name="product_form" method="post" action="/product" class="product">
<span>Pears</span>
<select class="form-control calculate" id="product" name="product">
<option data-price="1" value="1">1</option>
<option data-price="2" value="2">2</option>
<option data-price="3" value="3">3</option>
<option data-price="4" value="4">4</option>
</select>
<br />
<span class="item-price">5.00</span>
</form>
<form name="product_form" method="post" action="/product" class="product">
<span>grapes</span>
<select class="form-control calculate" id="product" name="product">
<option data-price="1" value="1">1</option>
<option data-price="2" value="2">2</option>
<option data-price="3" value="3">3</option>
<option data-price="4" value="4">4</option>
</select>
<br />
<span class="item-price">16.99</span>
</form>