(function($) { 'use strict'; $(function() { var minQty = 0; var wrapper = $('.yoone-bundle-form'); if (!wrapper.length) return; // 价格格式 var currencySymbol = wrapper.data('currency-symbol') || ''; var priceDecimals = parseInt(wrapper.data('price-decimals'), 10); var decSep = wrapper.data('decimal-separator') || '.'; var thouSep = wrapper.data('thousand-separator') || ','; var discountType = wrapper.data('discount-type') || 'none'; var discountAmount = parseFloat(wrapper.data('discount-amount') || '0'); // 从 DOM 中获取最小数量 var minText = wrapper.find('.yoone-bundle-min').text(); if (minText) { var match = minText.match(/\d+/); if (match) { minQty = parseInt(match[0], 10); } } function formatMoney(n) { var s = (typeof n === 'number') ? n : parseFloat(n || 0); if (isNaN(s)) s = 0; var fixed = s.toFixed(isNaN(priceDecimals) ? 2 : priceDecimals); var parts = fixed.split('.'); var intPart = parts[0]; var fracPart = parts[1] ? decSep + parts[1] : ''; // thousands grouping var rgx = /\B(?=(\d{3})+(?!\d))/g; intPart = intPart.replace(rgx, thouSep); return currencySymbol + intPart + fracPart; } function updateState() { var total = 0; wrapper.find('.yoone-bundle-qty').each(function() { var v = parseInt($(this).val(), 10); var unit = parseFloat($(this).data('unit-price') || '0'); if (!isNaN(v) && v > 0) { total += v; } }); // 更新显示的数量 wrapper.find('.yoone-bundle-selected-count').text(total); // 根据是否满足最小数量来启用/禁用按钮 var btn = wrapper.find('.single_add_to_cart_button'); if (total >= minQty) { btn.prop('disabled', false); } else { btn.prop('disabled', true); } // 计算价格总计与折扣后的总计 var rawSum = 0; wrapper.find('.yoone-bundle-qty').each(function() { var qty = parseInt($(this).val(), 10); var unit = parseFloat($(this).data('unit-price') || '0'); if (!isNaN(qty) && qty > 0 && !isNaN(unit) && unit > 0) { rawSum += qty * unit; } }); wrapper.find('.yoone-bundle-total-raw-value').text(formatMoney(rawSum)); if (discountType !== 'none' && discountAmount > 0) { var discounted = rawSum; if (discountType === 'percent') { discounted = rawSum * (1 - discountAmount / 100.0); } else if (discountType === 'fixed') { discounted = Math.max(0, rawSum - discountAmount); } wrapper.find('.yoone-bundle-total-discounted-value').text(formatMoney(discounted)); } } // 绑定事件 wrapper.on('change keyup', '.yoone-bundle-qty', updateState); // 页面加载时立即执行一次,以确保初始状态正确 updateState(); }); })(jQuery);