使用jQuery处理循环内商品总价:修改数量时总价串位问题
问题原因
- 重复ID冲突:循环中所有商品的总价
span都使用了同一个id="toplamFiyat",HTML规范要求ID必须唯一,导致jQuery选择器无法精准定位到当前修改的商品对应的总价元素,会错误更新其他商品的总价。 - 逻辑错位:JavaScript中更新的是全局元素
#tt,而非当前商品对应的总价span,进一步导致显示混乱。
解决步骤及代码示例
1. 修改后端循环的HTML结构
给每个商品的总价span设置唯一标识,同时用容器包裹商品的总价和数量输入框,方便后续通过相对位置定位元素:
@foreach (var item in Islemler.GetSepet()) { <!-- 用容器包裹单个商品的总价和数量输入 --> <div class="cart-item"> <!-- 给总价span设置唯一ID,或用class配合容器定位 --> <span id="item-total-@item.ID" class="badge rounded-pill badge-light-success"> </span> <input onchange="miktar(this)" data-idd="@item.ID" data-price="@item.SatisFiyat1" type="text" class="quantity-counter" value="@item.Miktar" /> </div> } <!-- 全局总价展示(如果需要保留) --> <div id="tt">Toplam Fiyat: ₺0.00</div>
2. 修正JavaScript逻辑
精准定位当前商品的总价元素,同时处理非数字输入的异常情况,可选更新全局总价:
function miktar(t) { var $input = $(t); var itemId = $input.data('idd'); var unitPrice = parseFloat($input.data('price')); // 处理数量输入非数字的情况,默认设为0 var quantity = parseFloat($input.val()) || 0; getValue("/Home/SepetGuncelle", { stokID: itemId, StokMiktar: quantity, BirimFiyat: unitPrice }, function (data, err) { // 计算当前商品的总价 var itemTotal = unitPrice * quantity; // 方式1:通过唯一ID定位当前商品的总价span $("#item-total-" + itemId).text( '₺' + itemTotal.toFixed(2).replace(/(\d)(?=(\d{3})+\.)/g, "$1,") ); // 方式2:如果不用唯一ID,通过容器相对定位(需把span的class设为item-total) // $input.closest('.cart-item').find('.item-total').text(...) // 可选:更新全局总价 var globalTotal = 0; $(".quantity-counter").each(function() { var price = parseFloat($(this).data('price')); var qty = parseFloat($(this).val()) || 0; globalTotal += price * qty; }); $("#tt").text( "Toplam Fiyat: ₺" + globalTotal.toFixed(2).replace(/(\d)(?=(\d{3})+\.)/g, "$1,") ); } ); }
内容的提问来源于stack exchange,提问作者Ahmet Enes Söylemez
相关产品推荐
相关产品推荐

