yoone-wc-product-bundles/assets/js/frontend.js

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);