88 lines
3.3 KiB
JavaScript
88 lines
3.3 KiB
JavaScript
(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); |