// 关于我们页面功能
document.addEventListener('DOMContentLoaded', function () {
const navItems = document.querySelectorAll('.nav-section .nav-item');
function showSection(targetId) {
const sections = document.querySelectorAll('.product-content > section');
const target = document.querySelector(targetId);
if (!target) return;
sections.forEach(section => section.classList.remove('active-section'));
target.classList.add('active-section');
navItems.forEach(nav => {
nav.classList.toggle('active', nav.getAttribute('href') === targetId);
});
setDropdownActive(targetId);
history.replaceState(null, '', targetId);
}
navItems.forEach(item => {
item.addEventListener('click', function (e) {
e.preventDefault();
showSection(this.getAttribute('href'));
});
});
document.querySelectorAll('.dropdown-menu a[href^="#"]').forEach(link => {
link.addEventListener('click', function (e) {
const targetId = this.getAttribute('href');
if (document.querySelector(`.nav-section .nav-item[href="${targetId}"]`)) {
e.preventDefault();
showSection(targetId);
}
});
});
document.querySelectorAll('a[href^="#"]').forEach(link => {
link.addEventListener('click', function (e) {
const targetId = this.getAttribute('href');
if (document.querySelector(`.nav-section .nav-item[href="${targetId}"]`)) {
e.preventDefault();
showSection(targetId);
}
});
});
const hash = window.location.hash;
const initialItem = hash ? document.querySelector(`.nav-section .nav-item[href="${hash}"]`) : navItems[0];
if (initialItem) showSection(initialItem.getAttribute('href'));
document.querySelectorAll('.nav-menu > li > .nav-link').forEach(link => {
if ((link.getAttribute('href') || '').includes('about')) link.classList.add('active');
});
initContactFormControls();
// 在 about.js 的 DOMContentLoaded 末尾添加
window.addEventListener('hashchange', function () {
const hash = window.location.hash;
if (hash) {
const targetItem = document.querySelector(`.nav-section .nav-item[href="${hash}"]`);
if (targetItem) {
showSection(hash);
}
}
});
});
// 处理联系表单提交
function setDropdownActive(targetId) {
document.querySelectorAll('.dropdown-menu a').forEach(link => {
const href = link.getAttribute('href') || '';
const hash = href.includes('#') ? href.substring(href.indexOf('#')) : href;
link.classList.toggle('active', hash === targetId);
});
}
function getInquiryTypeLabel(value) {
const labels = {
technical: '技术咨询',
business: '商务合作',
academic: '学术支持',
sample: '样品寄送'
};
return labels[value] || value;
}
function validateEmail(email) {
return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email);
}
function normalizePhone(phone) {
return phone.replace(/[\s()-]/g, '');
}
function validateCountryCode(countryCode) {
return /^\+[1-9]\d{0,3}$/.test(countryCode);
}
function validatePhone(countryCode, phone) {
if (!phone) return true;
const normalized = normalizePhone(phone);
const rules = {
'+86': /^1[3-9]\d{9}$/,
'+1': /^[2-9]\d{2}[2-9]\d{6}$/,
'+44': /^7\d{9}$/,
'+81': /^0?\d{9,10}$/,
'+65': /^[689]\d{7}$/,
other: /^\d{6,15}$/
};
return (rules[countryCode] || rules.other).test(normalized);
}
function showFormError(form, message) {
let box = form.querySelector('.form-error');
if (!box) {
box = document.createElement('p');
box.className = 'form-error';
form.querySelector('button[type="submit"]').insertAdjacentElement('beforebegin', box);
}
box.textContent = message;
}
// 处理联系表单提交
async function handleContactForm(event) {
event.preventDefault();
const form = event.target;
const inquirySelect = document.getElementById('inquiry-type');
const customInquiryInput = document.getElementById('custom-inquiry-type');
const countrySelect = document.getElementById('country-code');
const customCountryInput = document.getElementById('custom-country-code');
const rawInquiryType = inquirySelect.style.display === 'none' ? 'other' : inquirySelect.value;
const customInquiryType = customInquiryInput.value.trim();
const rawCountryCode = countrySelect.style.display === 'none' ? 'other' : countrySelect.value;
const customCountryCode = customCountryInput.value.trim();
const countryCode = rawCountryCode === 'other' ? customCountryCode : rawCountryCode;
const email = document.getElementById('email').value.trim();
const phone = document.getElementById('phone').value.trim();
const submitButton = form.querySelector('button[type="submit"]');
const formData = {
name: document.getElementById('name').value.trim(),
email,
countryCode,
customCountryCode,
phone,
inquiryType: rawInquiryType === 'other' ? 'other' : getInquiryTypeLabel(rawInquiryType),
customInquiryType,
otherInquiryType: customInquiryType,
message: document.getElementById('message').value.trim()
};
if (!formData.name) {
showFormError(form, '请填写姓名。');
return;
}
if (!email && !phone) {
showFormError(form, '邮箱和手机至少填写一项。');
return;
}
if (email && !validateEmail(email)) {
showFormError(form, '请填写正确的邮箱格式。');
return;
}
if (phone && rawCountryCode === 'other' && !validateCountryCode(customCountryCode)) {
showFormError(form, '请填写正确的国家/地区代码,例如 +66。');
return;
}
if (phone && !validatePhone(rawCountryCode, phone)) {
showFormError(form, '请填写正确的手机号码。左侧已选择国家/地区代码,右侧只需填写号码本身。');
return;
}
if (rawInquiryType === 'other' && !customInquiryType) {
showFormError(form, '选择“其他”时,请填写咨询类型。');
return;
}
if (!formData.message) {
showFormError(form, '请填写消息内容。');
return;
}
submitButton.disabled = true;
submitButton.textContent = '提交中...';
try {
const response = await fetch('https://haiguji-website.onrender.com/api/contact', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(formData)
});
const result = await response.json().catch(() => ({}));
if (!response.ok || !result.ok) {
throw new Error((result.errors || ['提交失败,请稍后再试。']).join(';'));
}
showFormError(form, '');
alert('感谢您的消息!我们会尽快与您联系。');
form.reset();
resetInlineControls();
} catch (error) {
showFormError(form, error.message || '提交失败,请稍后再试。');
} finally {
submitButton.disabled = false;
submitButton.textContent = '提交消息';
}
}
function resetInlineControls() {
const inquirySelect = document.getElementById('inquiry-type');
const customInquiryInput = document.getElementById('custom-inquiry-type');
const countrySelect = document.getElementById('country-code');
const customCountryInput = document.getElementById('custom-country-code');
if (inquirySelect && customInquiryInput) {
inquirySelect.style.display = '';
customInquiryInput.style.display = 'none';
customInquiryInput.value = '';
customInquiryInput.required = false;
}
if (countrySelect && customCountryInput) {
countrySelect.style.display = '';
customCountryInput.style.display = 'none';
customCountryInput.value = '';
customCountryInput.required = false;
}
}
function initContactFormControls() {
const inquirySelect = document.getElementById('inquiry-type');
const customInquiryInput = document.getElementById('custom-inquiry-type');
const countrySelect = document.getElementById('country-code');
const customCountryInput = document.getElementById('custom-country-code');
if (inquirySelect && customInquiryInput) {
inquirySelect.addEventListener('change', () => {
if (inquirySelect.value === 'other') {
inquirySelect.style.display = 'none';
customInquiryInput.style.display = 'block';
customInquiryInput.required = true;
customInquiryInput.focus();
}
});
customInquiryInput.addEventListener('blur', () => {
if (!customInquiryInput.value.trim()) {
inquirySelect.value = 'technical';
inquirySelect.style.display = '';
customInquiryInput.style.display = 'none';
customInquiryInput.required = false;
}
});
}
if (countrySelect && customCountryInput) {
countrySelect.addEventListener('change', () => {
if (countrySelect.value === 'other') {
countrySelect.style.display = 'none';
customCountryInput.style.display = 'block';
customCountryInput.required = true;
customCountryInput.focus();
}
});
customCountryInput.addEventListener('blur', () => {
if (!customCountryInput.value.trim()) {
countrySelect.value = '+86';
countrySelect.style.display = '';
customCountryInput.style.display = 'none';
customCountryInput.required = false;
}
});
}
}
// 页面加载时处理锚点导航
function initImageLightbox() {
if (document.querySelector('.image-lightbox')) return;
const box = document.createElement('div');
box.className = 'image-lightbox';
box.innerHTML = '
';
document.body.appendChild(box);
const img = box.querySelector('img');
const close = () => box.classList.remove('open');
box.querySelector('button').addEventListener('click', close);
box.addEventListener('click', event => { if (event.target === box) close(); });
document.addEventListener('keydown', event => { if (event.key === 'Escape') close(); });
document.querySelectorAll('.product-content img, .resource-content img, .about-container img, .products-preview img').forEach(item => {
item.addEventListener('click', () => {
img.src = item.currentSrc || item.src;
img.alt = item.alt || '图片预览';
box.classList.add('open');
});
});
}