Files
Website/ts3/static/js/download.js
2025-06-11 08:03:53 +08:00

204 lines
8.8 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

document.addEventListener('DOMContentLoaded', function() {
const downloadLink = document.getElementById('download-ts');
let preloadedDownloadLinks = null; // 预加载的 JSON 数据缓存(新增)
// 移动设备检测函数
const isMobile = function() {
return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);
};
// 平台检测函数
const getPlatform = function() {
if (/Win/i.test(navigator.platform)) {
return 'windows';
} else if (/Mac/i.test(navigator.platform)) {
return 'macos';
} else if (/Linux/i.test(navigator.platform)) {
return 'linux';
} else {
return 'other';
}
};
// 创建弹窗的完整函数
const createModal = function(content) {
const modal = document.createElement('div');
modal.className = 'download-modal';
modal.innerHTML = [
'<div class="modal-content">',
content,
'<button class="close-btn">×</button>',
'</div>'
].join('');
document.body.appendChild(modal);
setTimeout(function() {
modal.classList.add('visible');
}, 10);
const closeModal = function() {
modal.classList.remove('visible');
setTimeout(function() {
modal.remove();
}, 300);
};
modal.querySelector('.close-btn').addEventListener('click', closeModal);
modal.addEventListener('click', function(event) {
if (event.target === modal) {
closeModal();
}
});
return modal;
};
// 预加载 JSON 数据(新增)
fetch('https://file-us.ovofish.com/local_download_links.json')
.then(function(response) {
if (!response.ok) {
throw new Error('预加载失败:网络响应不正常');
}
return response.json();
})
.then(function(data) {
preloadedDownloadLinks = data; // 缓存预加载数据
})
.catch(function(error) {
console.error('预加载下载链接失败:', error);
// 预加载失败不影响后续逻辑,用户点击时会重新请求
});
if (downloadLink) {
downloadLink.addEventListener('click', function(event) {
event.preventDefault();
// 移动设备处理
if (isMobile()) {
createModal([
'<h3>设备兼容性提示</h3>',
'<p style="color: #e74c3c; font-size: 1.1rem;">🚫 暂不支持移动端下载</p>',
'<p>请使用桌面设备访问:</p>',
'<button class="version-btn" onclick="window.open(\'https://teamspeak.com/en/downloads/\', \'_blank\')">',
'访问官网下载',
'</button>'
].join(''));
return;
}
// 桌面设备处理(修改:优先使用预加载数据)
const platform = getPlatform();
const dataSource = preloadedDownloadLinks || fetch('https://file-us.ovofish.com/local_download_links.json'); // 优先使用缓存
// 若预加载成功,直接使用缓存数据;否则重新请求
if (preloadedDownloadLinks) {
handleDownload(preloadedDownloadLinks, platform);
} else {
fetch('https://file-us.ovofish.com/local_download_links.json')
.then(function(response) {
if (!response.ok) {
throw new Error('网络响应不正常');
}
return response.json();
})
.then(function(data) {
handleDownload(data, platform);
})
.catch(function(error) {
console.error('获取下载链接失败:', error);
if (error.message.includes('CORS')) {
createModal([
'<h3>网络错误</h3>',
'<p style="color: #e74c3c;">无法获取下载链接,可能是服务器配置问题,请稍后再试或联系管理员。</p>'
].join(''));
}
window.open('https://teamspeak.com/en/downloads/', '_blank');
});
}
// 提取下载逻辑为独立函数(新增)
function handleDownload(data, platform) {
const modalContent = [
'<h3>选择版本 (' + platform.toUpperCase() + ')</h3>'
];
if (data.Ver3.length > 0) {
modalContent.push('<button class="version-btn" data-version="Ver3">TeamSpeak 3 客户端</button>');
}
if (data.Ver6.length > 0) {
modalContent.push('<button class="version-btn" data-version="Ver6">TeamSpeak 6 客户端</button>');
}
if (data.Ver3.length > 0) {
modalContent.push('<button class="version-btn" data-version="Ver3Server">TeamSpeak 3 服务器</button>');
}
const modal = createModal(modalContent.join(''));
modal.querySelectorAll('.version-btn').forEach(function(button) {
button.addEventListener('click', function(event) {
const version = event.target.dataset.version;
let downloadUrl = '';
const isWindows = platform === 'windows';
const isMac = platform === 'macos';
const isLinux = platform === 'linux';
if (version === 'Ver3') {
if (isWindows) {
downloadUrl = data.Ver3.find(function(url) {
return url.includes('Client-win') && url.endsWith('.exe');
});
} else if (isMac) {
downloadUrl = data.Ver3.find(function(url) {
return url.includes('Client-macosx') && url.endsWith('.dmg');
});
} else if (isLinux) {
downloadUrl = data.Ver3.find(function(url) {
return (url.includes('Client-linux') || url.includes('linux_amd64')) &&
(url.endsWith('.run') || url.endsWith('.tar.bz2'));
});
}
} else if (version === 'Ver6') {
if (isWindows) {
downloadUrl = data.Ver6.find(function(url) {
return url.includes('client.msi');
});
} else if (isMac) {
downloadUrl = data.Ver6.find(function(url) {
return url.includes('client.dmg');
});
} else if (isLinux) {
downloadUrl = data.Ver6.find(function(url) {
return url.includes('client.tar.gz');
});
}
} else if (version === 'Ver3Server') {
if (isWindows) {
downloadUrl = data.Ver3.find(function(url) {
return url.includes('server_win') && url.endsWith('.zip');
});
} else if (isMac) {
downloadUrl = data.Ver3.find(function(url) {
return url.includes('server_mac') && url.endsWith('.zip');
});
} else if (isLinux) {
downloadUrl = data.Ver3.find(function(url) {
return url.includes('server_linux') && url.endsWith('.tar.bz2');
});
}
}
if (downloadUrl) {
window.open(downloadUrl, '_blank');
} else {
alert('该版本暂无可用的下载链接');
window.open('https://teamspeak.com/en/downloads/', '_blank');
}
modal.remove();
});
});
}
});
}
});