You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在jQuery中保留data属性原始值以计算正确月度费用

问题:基于原始值计算每月费用,避免覆盖data属性导致的错误计算

我有一个带数量输入框的服务选项卡片,数量变化时会更新元素的data-monthly属性。但现在每次计算都会用更新后的属性值而非原始值,导致结果错误——比如初始值10,点击+按钮后console输出是10→20→60→240,这是因为每次都用新的data-monthly值乘以数量。我需要始终用原始的data-monthly值计算,得到10→20→30→40的结果,且不能硬编码数值,因为不同卡片的原始值不同。


解决方案

核心问题是你在每次计算后覆盖了data-monthly的原始值,所以需要保留原始的月度费用值,不要修改它。以下是两种可行方案:

方案1:新增专属data属性存储原始值

在HTML中给卡片添加一个专门存储原始月度费用的属性,后续计算始终基于这个值:

修改后的HTML

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<div class="service-option-card" data-monthly="10" data-original-monthly="10">
  <input style="display: none;" class="price" value="50">                                           
  <p class="option-price">$50</p>
  <div class="quantity">
    <button class="btn btn-quantity dec">-</button>
    <input class="quantity-input quantity" value="1">
    <button class="btn btn-quantity inc">+</button>
  </div>
</div>

<div class="col-md-6 services-total-side">  
  <div class="calculated-totals">
    <p class="cost-title">Monthly Cost:</p>
    <p class="monthly-cost">$0</p>
  </div>
</div>

修改后的关键JavaScript代码

在updatePrice函数中,改用data-original-monthly获取原始值,data-monthly仅存储计算后的结果:

function updatePrice(quantity, service) {
  var price = parseInt(service.find(".price").val().replace(/,/g, ""));
  var total = quantity * price;

  if(total < 0) {
    total = 0;
  }

  newPrice = numberFormat(total);
  service.find(".option-price").html("$" + newPrice);

  // 基于原始值计算月度费用
  var originalMonthly = service.data('original-monthly');
  newMonthly = originalMonthly * quantity;
  console.log(newMonthly);

  updateReceiptMonthly(service, newMonthly);
}

方案2:初始化时缓存原始值到元素自定义属性

如果不想修改HTML,可以在页面加载时把每个卡片的data-monthly原始值缓存到元素的自定义属性中:

添加初始化代码

// 页面加载完成后缓存所有卡片的原始月度费用
$(document).ready(function() {
  $(".service-option-card").each(function() {
    this._originalMonthly = $(this).data('monthly');
  });
});

修改updatePrice函数

function updatePrice(quantity, service) {
  var price = parseInt(service.find(".price").val().replace(/,/g, ""));
  var total = quantity * price;

  if(total < 0) {
    total = 0;
  }

  newPrice = numberFormat(total);
  service.find(".option-price").html("$" + newPrice);

  // 使用缓存的原始值计算
  var originalMonthly = service[0]._originalMonthly;
  newMonthly = originalMonthly * quantity;
  console.log(newMonthly);

  updateReceiptMonthly(service, newMonthly);
}

额外优化:修复减号按钮的变量作用域问题

原代码中dec函数存在重复声明变量的问题,建议修改:

$(".dec").click(function(){
  const service = $(this).closest(".service-option-card");
  const quantity = getCurrentQuantity(service);
  let newQuantity = quantity - 1;

  // 确保数量不小于0,去掉重复的let声明
  newQuantity = Math.max(newQuantity, 0);
  setNewQuantity(newQuantity, service);

  updatePrice(newQuantity, service);
});

内容的提问来源于stack exchange,提问作者JDawwgy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 11:10:23