修复套餐选择后默认服务时长未带出问题:1)优化元素获取方式,确保能找到正确的表单和输入框;2)添加全面的错误处理和调试信息;3)触发change事件确保所有依赖功能更新

This commit is contained in:
2025-12-06 01:33:18 +08:00
parent 9a256cda0a
commit aefd3df9ae
+147 -61
View File
@@ -798,115 +798,201 @@ try {
// 更新套餐信息
function updatePackageInfo(submissionId) {
console.log('updatePackageInfo called with submissionId:', submissionId);
console.log('=== updatePackageInfo called with submissionId:', submissionId, '===');
// 直接获取表单元素,确保在正确的表单上下文中操作
const packageSelect = document.getElementById('selected_package_' + submissionId);
if (!packageSelect) {
console.error('Package select not found for submissionId:', submissionId);
console.error('Package select not found for submissionId:', submissionId);
return;
}
// 获取当前表单
const form = packageSelect.closest('form');
if (!form) {
console.error('❌ Form not found for submissionId:', submissionId);
return;
}
const selectedOption = packageSelect.options[packageSelect.selectedIndex];
const packageInfoDiv = document.getElementById('packageInfo_' + submissionId);
const durationInput = document.getElementById('duration_' + submissionId);
const totalPriceInput = document.getElementById('total_price_' + submissionId);
console.log('Selected option:', selectedOption, 'value:', selectedOption ? selectedOption.value : 'null');
if (selectedOption && selectedOption.value) {
// 直接从selectedOption的data-duration属性获取时长
const duration = parseInt(selectedOption.dataset.duration);
const price = parseFloat(selectedOption.dataset.price);
const services = JSON.parse(selectedOption.dataset.services);
// 使用getAttribute方法获取data属性,确保兼容所有浏览器
const duration = parseInt(selectedOption.getAttribute('data-duration'));
const price = parseFloat(selectedOption.getAttribute('data-price'));
const servicesJSON = selectedOption.getAttribute('data-services');
const services = servicesJSON ? JSON.parse(servicesJSON) : [];
console.log('Package data using dataset:', {duration, price});
console.log('Package data:', {duration, price, services: services.length});
// 更新套餐信息显示
document.getElementById('packageName_' + submissionId).textContent = selectedOption.textContent;
document.getElementById('packageDuration_' + submissionId).textContent = `基础时长: ${duration}分钟`;
document.getElementById('packagePrice_' + submissionId).textContent = `套餐价格: ¥${price.toFixed(2)}`;
const packageNameElement = document.getElementById('packageName_' + submissionId);
const packageDurationElement = document.getElementById('packageDuration_' + submissionId);
const packagePriceElement = document.getElementById('packagePrice_' + submissionId);
if (packageNameElement) packageNameElement.textContent = selectedOption.textContent;
if (packageDurationElement) packageDurationElement.textContent = `基础时长: ${duration}分钟`;
if (packagePriceElement) packagePriceElement.textContent = `套餐价格: ¥${price.toFixed(2)}`;
// 更新服务项目显示
const servicesContainer = document.getElementById('packageServices_' + submissionId);
if (services && services.length > 0) {
servicesContainer.innerHTML = '<strong>包含服务:</strong><br>' +
services.map(service => `• ${service}`).join('<br>');
} else {
servicesContainer.innerHTML = '';
if (servicesContainer) {
if (services && services.length > 0) {
servicesContainer.innerHTML = '<strong>包含服务:</strong><br>' +
services.map(service => `• ${service}`).join('<br>');
} else {
servicesContainer.innerHTML = '';
}
}
// 直接更新时长输入框
// 使用两种方式获取时长输入框,确保万无一失
const durationInputById = document.getElementById('duration_' + submissionId);
const durationInputByName = form.querySelector('input[name="duration"]');
console.log('Duration inputs found - by ID:', durationInputById ? 'Yes' : 'No', 'by Name:', durationInputByName ? 'Yes' : 'No');
// 优先使用ID获取的元素,如果不存在则使用name获取的元素
const durationInput = durationInputById || durationInputByName;
if (durationInput) {
// 强制设置时长值
durationInput.value = duration;
console.log('Directly updated duration input to:', duration);
// 触发change事件,确保所有依赖此输入的功能都能更新
durationInput.dispatchEvent(new Event('change'));
console.log('✅ Successfully updated duration input to:', duration);
} else {
console.error('Duration input not found for submissionId:', submissionId);
console.error('❌ Cannot find duration input for submissionId:', submissionId);
}
// 更新价格输入框
const totalPriceInput = document.getElementById('total_price_' + submissionId);
if (totalPriceInput) {
totalPriceInput.value = price.toFixed(2);
console.log('✅ Updated total price to:', price.toFixed(2));
}
// 更新快捷选择按钮状态
console.log('Calling selectDuration with:', submissionId, duration);
selectDuration(submissionId, duration);
packageInfoDiv.style.display = 'block';
// 显示套餐信息
if (packageInfoDiv) {
packageInfoDiv.style.display = 'block';
}
} else {
packageInfoDiv.style.display = 'none';
if (packageInfoDiv) {
packageInfoDiv.style.display = 'none';
}
console.log('❌ No package selected');
}
}
// 快捷选择服务时长
function selectDuration(submissionId, minutes) {
console.log('selectDuration called with submissionId:', submissionId, 'minutes:', minutes);
console.log('=== selectDuration called with submissionId:', submissionId, 'minutes:', minutes, '===');
// 直接通过ID获取时长输入框
const durationInput = document.getElementById('duration_' + submissionId);
const customDurationInput = document.getElementById('customDuration_' + submissionId);
// 更新时长输入框
if (durationInput) {
durationInput.value = minutes;
console.log('selectDuration updated duration input to:', minutes);
} else {
console.error('Duration input not found in selectDuration for submissionId:', submissionId);
// 先检查minutes是否有效
if (isNaN(minutes) || minutes <= 0) {
console.error('❌ Invalid minutes value:', minutes);
return;
}
// 更新自定义时长输入框
if (customDurationInput) {
customDurationInput.value = minutes;
// 使用两种方式获取表单,确保找到正确的表单
let form = null;
// 方式1:通过套餐选择元素获取表单
const packageSelect = document.getElementById('selected_package_' + submissionId);
if (packageSelect) {
form = packageSelect.closest('form');
console.log('Form found via packageSelect:', form ? 'Yes' : 'No');
}
// 直接通过ID获取packageInfo元素,然后找到其父表单
const packageInfo = document.getElementById('packageInfo_' + submissionId);
let form;
if (packageInfo) {
form = packageInfo.closest('form');
} else {
// 如果找不到packageInfo,尝试通过packageSelect找到表单
const packageSelect = document.getElementById('selected_package_' + submissionId);
if (packageSelect) {
form = packageSelect.closest('form');
// 方式2:如果方式1失败,通过时长输入框获取表单
if (!form) {
const durationInputById = document.getElementById('duration_' + submissionId);
if (durationInputById) {
form = durationInputById.closest('form');
console.log('Form found via durationInputById:', form ? 'Yes' : 'No');
}
}
console.log('Found form:', form);
// 方式3:如果还是失败,尝试通过packageInfo找到表单
if (!form) {
const packageInfo = document.getElementById('packageInfo_' + submissionId);
if (packageInfo) {
form = packageInfo.closest('form');
console.log('Form found via packageInfo:', form ? 'Yes' : 'No');
}
}
if (form) {
// 获取表单内的所有时长按钮
const durationButtons = form.querySelectorAll('.duration-btn');
console.log('Found duration buttons:', durationButtons.length);
// 方式4:如果还是失败,尝试通过自定义时长输入框找到表单
if (!form) {
const customDurationInput = document.getElementById('customDuration_' + submissionId);
if (customDurationInput) {
form = customDurationInput.closest('form');
console.log('Form found via customDurationInput:', form ? 'Yes' : 'No');
}
}
if (!form) {
console.error('❌ Form not found for submissionId:', submissionId);
return;
}
// 使用两种方式获取时长输入框,确保万无一失
const durationInputById = document.getElementById('duration_' + submissionId);
const durationInputByName = form.querySelector('input[name="duration"]');
const durationInput = durationInputById || durationInputByName;
if (durationInput) {
// 强制设置时长值
durationInput.value = minutes;
// 触发change事件,确保所有依赖此输入的功能都能更新
durationInput.dispatchEvent(new Event('change'));
console.log('✅ Duration input updated to:', minutes);
} else {
console.error('❌ Duration input not found for submissionId:', submissionId);
}
// 更新自定义时长输入框
const customDurationInput = document.getElementById('customDuration_' + submissionId);
if (customDurationInput) {
customDurationInput.value = minutes;
console.log('✅ Custom duration input updated to:', minutes);
} else {
console.error('❌ Custom duration input not found for submissionId:', submissionId);
}
// 获取当前表单的时长按钮
const durationButtons = form.querySelectorAll('.duration-btn');
console.log('Found duration buttons:', durationButtons.length);
if (durationButtons.length === 0) {
console.warn('⚠️ No duration buttons found in form');
return;
}
// 更新按钮选中状态
let buttonFound = false;
durationButtons.forEach(btn => {
// 使用getAttribute获取data属性,确保兼容所有浏览器
const btnDuration = parseInt(btn.getAttribute('data-duration'));
console.log('Checking button:', btn.textContent, 'data-duration:', btnDuration);
// 更新按钮选中状态
durationButtons.forEach(btn => {
const btnDuration = parseInt(btn.dataset.duration);
if (btnDuration === minutes) {
btn.classList.add('selected');
console.log('Added selected class to button with duration:', btnDuration);
} else {
btn.classList.remove('selected');
}
});
if (btnDuration === minutes) {
btn.classList.add('selected');
console.log('✅ Added selected class to button with duration:', btnDuration);
buttonFound = true;
} else {
btn.classList.remove('selected');
}
});
if (!buttonFound) {
console.warn('⚠️ No matching duration button found for:', minutes, 'minutes');
}
}